写入数据来自对Kafka的并发请求

时间:2017-05-02 03:11:44

标签: performance apache-kafka elixir

我正在构建一个事件收集器,它将收到一个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之前我是否需要一个队列?我的目标是尽可能多地处理并发请求。

感谢。

1 个答案:

答案 0 :(得分:1)

考虑使用Confluent Kafka REST代理,因为您可能不需要编写任何服务器端代码。

https://github.com/confluentinc/kafka-rest

最糟糕的情况是,您可能需要将传入的URL重写为格式正确的HTTP POST,其中包含JSON数据和Content-Type的正确HTTP标头。这可以通过和应用程序负载均衡器或像haproxy或nginx这样的基本反向代理来完成。