TCP连接如何由kafka-clients scala库管理?

时间:2017-12-22 05:04:22

标签: scala tcp apache-kafka

我正在使用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的后续调用共享相同的连接。

2 个答案:

答案 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连接”都不完全正确。