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

for*_*has 7 java apache-kafka

在大量实时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);
Run Code Online (Sandbox Code Playgroud)

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

sec*_*ike 7

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

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

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

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

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


Chr*_*lma 5

卡夫卡:权威指南,在卡夫卡生产者章,作者说:

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

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