在大量实时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)
如您所见,一旦创建了生产者,我就可以使用它将数据发送到不同的主题.我想知道什么是最佳做法?如果我的应用程序发送到多个主题(每个主题获得不同的数据)可以/我应该使用单个生产者还是应该创建多个生产者?什么时候(一般来说)我应该使用多个生产者?
通常,所有主题的单个生产者将更具网络效率.
如果kafka客户端在同一Kafka节点上看到多个主题+分区,则它可以在单个消息中为主题+分区发送消息.Kafka优化了消息批处理,因此效率很高.
此外,您的Web服务器只需要与每个Kafka节点保持最多一个tcp连接,而不是每个节点每个生产者一个连接.
有关Kafka设计的更多信息:https: //kafka.apache.org/documentation.html#design
正如您在评论中提到的,锁定争用可能成为限制因素,YMMV.