在卡夫卡创造了多少生产商?

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

在这种情况下,我不确定每个主题创建一个制作人的天气,还是我应该使用单个制作人来处理我的所有主题?

这是我的代码:

props = new Properties(); props.put("zk.connect", :,:,:); props.put("zk.connectiontimeout.ms", "1000000"); props.put("producer.type", "async"); Producer producer = new kafka.javaapi.producer.Producer(new ProducerConfig(props)); ProducerData producerData1 = new ProducerData("someTopic1", messageTosend); ProducerData producerData2 = new ProducerData("someTopic2", messageTosend); producer.send(producerData1); producer.send(producerData2); 

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

通常,所有主题的单个生产者将更具网络效率。

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

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

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

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

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

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

来自Kafka:The Kinka Producers Chapter中的权威指南 ,作者说:

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

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

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