在Kafka要创造多少个制作人?

ecbunoof  于 2021-06-07  发布在  Kafka
关注(0)|答案(4)|浏览(266)

在一个大容量实时javaweb应用程序中,我向apachekafka发送消息。目前我只发送一个主题,但将来可能需要发送多个主题的消息。
在这种情况下,我不确定是否要为每个主题创建一个制作者,或者我是否应该为所有主题使用一个制作者?
这是我的密码:

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);

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

e5njpo68

e5njpo681#

来自《Kafka:最终指南》,在《Kafka制作人》一章,作者说:
您可能希望从一个生产者和一个线程开始。如果需要更好的吞吐量,可以添加更多使用同一生产者的线程。一旦这停止增加吞吐量,您就可以向应用程序添加更多生产者,以获得更高的吞吐量。
因此,拥有多个生产商实际上可能有好处。

pcww981p

pcww981p2#

一般来说,所有主题的单一制作人将更高效地进行网络制作。
如果kafka客户端在同一kafka节点上看到多个topic+分区,它可以在一条消息中为两个topic+分区发送消息。kafka优化了消息批处理,因此这是有效的。
此外,您的web服务器最多只需要维护到每个kafka节点的一个tcp连接,而不是每个生产者、每个节点的一个连接。
有关Kafka设计的更多信息:https://kafka.apache.org/documentation.html#design
正如您在评论中提到的,锁争用可能会成为一个限制因素,ymmv。

flvlnr44

flvlnr443#

我们已经在实践中验证了每个主题只有一个生产者是最佳的。但是,如果遇到长而胖的网络问题,拥有多个生产者是很有用的,在这种情况下,我们必须有多个连接才能充分利用网络。
如果您必须发送到很远的主机,则单个tcp连接(kafka使用的)中的批处理和流水线本身将无法扩展到大批,除非您进行tcp调优以获得较大的窗口大小。当你尝试更多的生产者时,情况就是这样。

sg24os4d

sg24os4d4#

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

相关问题