我正在构建一个事件收集器,它将接收一个http请求,如 http://collector.me/?uuid=123&product=D3F4&metric=view
然后将请求参数写入apachekafka主题,现在我使用plug、cowboy和kafkaex。
defmodule Collector.Router do
import Plug.Conn
def init(opts) do
opts
end
def call(conn, _opts) do
conn = fetch_query_params(conn)
KafkaEx.produce("test", 0, "#{inspect conn.query_params}")
conn
|> put_resp_content_type("text/plain")
|> send_resp(200, "OK")
end
end
好吧,牛仔会为每个请求生成一个新的过程,所以我想在 call
函数是一种合适的方法,因为它很容易在elixir中创建数十万个进程。但我不知道这样做对不对?在给Kafka写信之前我需要排队吗?我的目标是处理尽可能多的并发请求。
谢谢。
1条答案
按热度按时间pcww981p1#
考虑使用合流kafkarest代理,因为这样您就不需要编写任何服务器端代码。
https://github.com/confluentinc/kafka-rest
最糟糕的情况是,您可能需要将传入的url重写为格式正确的httppost,其中包含json数据和内容类型的正确http头。这可以通过应用程序和负载平衡器或基本的反向代理(如haproxy或nginx)来完成。