【问题标题】:How many producers to create in kafka?在 kafka 中创建多少生产者?
【发布时间】:2014-02-18 01:07:34
【问题描述】:

在大容量实时 Java Web 应用程序中,我正在向 apache kafka 发送消息。 目前我正在向单个主题发送消息,但将来我可能需要向多个主题发送消息。

在这种情况下,我不确定要为每个主题创建一个生产者,还是应该为我的所有主题使用一个生产者?

这是我的代码:

props = new Properties();
props.put("zk.connect", <zk-ip1>:<2181>,<zk-ip3>:<2181>,<zk-ip3>:<2181>);
props.put("zk.connectiontimeout.ms", "1000000");
props.put("producer.type", "async");

Producer<String, Message> producer = new kafka.javaapi.producer.Producer<String, Message>(new ProducerConfig(props));

ProducerData<String, Message> producerData1 = new ProducerData<String, Message>("someTopic1", messageTosend);
ProducerData<String, Message> producerData2 = new ProducerData<String, Message>("someTopic2", messageTosend);

producer.send(producerData1);
producer.send(producerData2);

如您所见,一旦创建了生产者,我就可以使用它向不同的主题发送数据。 我想知道最佳做法是什么?如果我的应用程序发送到多个主题(每个主题获取不同的数据),我可以/应该使用单个生产者还是应该创建多个生产者?什么时候(一般来说)我应该使用多个生产者?

【问题讨论】:

    标签: java apache-kafka


    【解决方案1】:

    一般来说,所有主题的单一生产者会更有网络效率。

    如果 kafka 客户端在同一个 Kafka 节点上看到多个主题+分区,它可以在一条消息中发送两个主题+分区的消息。 Kafka 针对消息批处理进行了优化,因此效率很高。

    此外,您的 Web 服务器只需要与每个 Kafka 节点保持最多一个 tcp 连接,而不是每个生产者、每个节点一个连接。

    有关 Kafka 设计的更多信息: https://kafka.apache.org/documentation.html#design

    正如您在 cmets 中提到的,锁争用可能成为限制因素,YMMV。

    【讨论】:

      【解决方案2】:

      我们已经在实践中验证了每个主题只有一个生产者是最优的。但是,如果您遇到长而胖的网络问题,拥有多个生产者会很有用,在这种情况下,我们必须有多个连接才能充分利用网络。

      如果您必须发送到远处的主机,则单个 TCP 连接(Kafka 使用的)中的批处理和流水线处理本身不会扩展到大批量,除非您执行 TCP 调整以具有较大的窗口大小。当您可以尝试更多的生产者时就是这种情况。

      【讨论】:

        【解决方案3】:

        在 0.8.2.0 及更高版本中,如果您对多个主题使用相同的 kafka 生产者,则循环分配的默认 Partitioner 逻辑将失败。

        【讨论】:

          【解决方案4】:

          来自Kafka: The Definitive Guide,在卡夫卡生产者章节中,作者说:

          您可能希望从一个生产者和一个线程开始。如果您需要更好的吞吐量,您可以添加更多使用相同生产者的线程。一旦这不再增加吞吐量,您就可以向应用程序添加更多生产者以实现更高的吞吐量。

          因此,拥有多个生产者实际上可能会带来好处。

          【讨论】:

            猜你喜欢
            • 2020-05-28
            • 1970-01-01
            • 1970-01-01
            • 2019-07-22
            • 2018-02-28
            • 2018-07-27
            • 1970-01-01
            • 2023-01-09
            • 1970-01-01
            相关资源
            最近更新 更多