在一个大容量实时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,我就可以使用它将数据发送到不同的主题。我想知道最好的做法是什么?如果我的应用程序发送到多个主题(每个主题获得不同的数据),我可以/应该使用一个生产者还是应该创建多个生产者?什么时候(一般来说)我应该使用多个生产者?
4条答案
按热度按时间e5njpo681#
来自《Kafka:最终指南》,在《Kafka制作人》一章,作者说:
您可能希望从一个生产者和一个线程开始。如果需要更好的吞吐量,可以添加更多使用同一生产者的线程。一旦这停止增加吞吐量,您就可以向应用程序添加更多生产者,以获得更高的吞吐量。
因此,拥有多个生产商实际上可能有好处。
pcww981p2#
一般来说,所有主题的单一制作人将更高效地进行网络制作。
如果kafka客户端在同一kafka节点上看到多个topic+分区,它可以在一条消息中为两个topic+分区发送消息。kafka优化了消息批处理,因此这是有效的。
此外,您的web服务器最多只需要维护到每个kafka节点的一个tcp连接,而不是每个生产者、每个节点的一个连接。
有关Kafka设计的更多信息:https://kafka.apache.org/documentation.html#design
正如您在评论中提到的,锁争用可能会成为一个限制因素,ymmv。
flvlnr443#
我们已经在实践中验证了每个主题只有一个生产者是最佳的。但是,如果遇到长而胖的网络问题,拥有多个生产者是很有用的,在这种情况下,我们必须有多个连接才能充分利用网络。
如果您必须发送到很远的主机,则单个tcp连接(kafka使用的)中的批处理和流水线本身将无法扩展到大批,除非您进行tcp调优以获得较大的窗口大小。当你尝试更多的生产者时,情况就是这样。
sg24os4d4#
在0.8.2.0及更高版本中,如果对多个主题使用同一个kafka生产者,则循环赋值的默认分区器逻辑将失败。