我正在使用kafka-clients库将Kafka与Scala应用程序集成。并且发现很难理解,如何以及何时在经纪人和生产者/消费者之间建立TCP连接。
请核实我对以下几点的理解 -
(1)在初始化KafkaProducer实例时没有建立TCP连接。
val producer = new KafkaProducer[String, String](properties)
这也适用于KafkaConsumer。
val consumer = new KafkaConsumer[String, String](properties)
(2)在向Broker生成记录时建立第一个TCP连接(Broker和Producer之间)。
producer.send(record1)
(3)从同一个Producer到同一个Broker的后续send()
调用将共享相同的TCP连接,而不管主题如何。
producer.send(record2)
(4)对于Consumer,在轮询主题(而不是订阅)时建立第一个TCP连接。
val records = consumer.poll(timeout)
(5)同一个消费者对同一个Broker的后续调用共享相同的连接。
答案 0 :(得分:6)
在初始化KafkaProducer实例时未建立TCP连接。
不完全是。 KafkaProducer初始化将从多个TCP连接中启动Sender线程,将建立所有引导服务器。这些套接字将用于从集群中检索元数据。
在向Broker生成记录时建立第一个TCP连接(Broker和Producer之间)。
几乎正确。实际上,客户端总是为代理创建多个TCP连接。当你有一个经纪人时,情况就是如此。对于生产者,它通常会创建两个连接,其中一个用于更新元数据,另一个用于发送消息。对于消费者(假设您正在使用消费者群体),似乎它将创建3个连接。一个寻找协调员;一个用于组管理(包括加入/同步组和偏移事物);一个用于检索偏移,另一个用于提取消息 更新:消费者创建3个连接,而不是我之前声称的4个连接。感谢@ppatierno提醒。
从同一个Producer到同一个Broker的后续send()调用将共享相同的TCP连接,而不管主题如何。
后续发送调用重用第二个连接生成器创建。
如果是Consumer,则在轮询主题(而不是订阅)时建立第一个TCP连接。
是的,所有连接都是在poll
电话中创建的。
同一个Consumer对同一个Broker的后续调用共享相同的连接。
后续调用轮询重用最后一个连接消费者创建。
答案 1 :(得分:5)
从同一个Producer到同一个Broker的后续send()调用将会 无论主题如何,都可以共享相同的TCP连接。
只是添加(@amethystic的答案)如果生产者试图发送到一个新主题并且它所连接的代理不是领导者,那么生产者需要获取有关该主题的元数据并打开与代理商的新连接,该代理商是该主题的领导者。因此,“无论主题如何共享相同的TCP连接”都不完全正确。