在大量实时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);
正如您所看到的,一旦创建了生产者,我就可以使用它将数据发送到不同的主题。 我想知道什么是最佳做法?如果我的应用程序发送到多个主题(每个主题获得不同的数据)可以/我应该使用单个生产者还是应该创建多个生产者?什么时候(一般来说)我应该使用多个生产者?
答案 0 :(得分:7)
一般而言,所有主题的单一制作人将提高网络效率。
如果kafka客户端在同一个Kafka节点上看到多个主题+分区,它可以在单个消息中为主题+分区发送消息。 Kafka优化了消息批处理,因此效率很高。
此外,您的Web服务器只需要与每个Kafka节点保持最多一个tcp连接,而不是每个节点每个生产者一个连接。
有关Kafka设计的更多信息: https://kafka.apache.org/documentation.html#design
正如您在评论中提到的,锁定争用可能成为限制因素,YMMV。
答案 1 :(得分:4)
来自Kafka: The Definitive Guide,在卡夫卡制片人章节中,作者说:
您可能希望从一个生产者和一个线程开始。如果需要更高的吞吐量,可以添加更多使用相同生产者的线程。一旦这停止增加吞吐量,您可以向应用程序添加更多生成器以实现更高的吞吐量。
因此,拥有多个生产者实际上可能会有好处。
答案 2 :(得分:1)
我们在实践中已经验证,每个主题只有一个生产者是最佳的。但是,如果遇到长而胖的网络问题,拥有多个生产者是有用的,在这种情况下,我们必须有多个连接才能充分利用网络。
如果必须远程发送到主机,除非您将TCP调整设置为具有大窗口大小,否则单个TCP连接(如Kafka使用)中的批处理和流水线操作本身不会扩展到大批量。当您尝试更多生产者时就是这种情况。
答案 3 :(得分:0)
在0.8.2.0及更高版本中如果您对多个主题使用相同的kafka生成器,则循环分配的默认分区程序逻辑将失败。