在kafka中创建多少个生产者?

2022-09-04 19:35:45

在一个高容量的实时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);

如您所见,一旦创建了创建创建器,我就可以使用它将数据发送到不同的主题。我想知道什么是最佳实践?如果我的应用发送到多个主题(每个主题获取不同的数据),我可以/应该使用单个生产者还是应该创建多个生产者?何时(一般而言)我应该使用多个生产者?


答案 1

一般来说,所有主题的单个生产者将提高网络效率。

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

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

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

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


答案 2

来自 Kafka: The Definitive Guide,在 Kafka Producer Chapter 中,作者说:

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

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


推荐