我正在构建一个事件收集器,它将收到一个http请求,如http://collector.me/?uuid=abc123&product=D3F4&metric=view
然后将请求参数写入Apache Kafka主题,现在我使用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
AFAIK,Cowboy为每个请求生成一个新进程,因此我认为在call
函数中写入Kafka是一种正确的方法,因为在Elixir中创建数十万个进程很容易。但我想知道这是否是正确的方法?在写入Kafka之前我是否需要一个队列?我的目标是尽可能多地处理并发请求。
感谢。
答案 0 :(得分:1)
考虑使用Confluent Kafka REST代理,因为您可能不需要编写任何服务器端代码。
https://github.com/confluentinc/kafka-rest
最糟糕的情况是,您可能需要将传入的URL重写为格式正确的HTTP POST,其中包含JSON数据和Content-Type的正确HTTP标头。这可以通过和应用程序负载均衡器或像haproxy或nginx这样的基本反向代理来完成。