Java KafkaProducer是否会在KafkaProducer因某种原因无法连接到kafka时打开任何套接字和管道?

Java KafkaProducer是否会在KafkaProducer因某种原因无法连接到kafka时打开任何套接字和管道?,java,apache-kafka,kafka-producer-api,Java,Apache Kafka,Kafka Producer Api,java KafkaProducer是否打开任何管道或套接字以连接到kafka? 如果kafka producer对象无法连接到kafka,它会关闭这些管道和套接字吗?每个KafkaProducer都必须在本地打开TCP套接字,以尝试连接到它配置的kafka服务器。它需要在实例化时执行此操作,因为Kafka将从服务器获取元数据(哪些主题可用,哪些是每个分区的前导,是否压缩数据,等等),所以只要有producer.send()请求,它就可以开始了。假设Kafka服务器已启动且可访问,则在接受连接的

java KafkaProducer是否打开任何管道或套接字以连接到kafka?
如果kafka producer对象无法连接到kafka,它会关闭这些管道和套接字吗?

每个
KafkaProducer
都必须在本地打开TCP套接字,以尝试连接到它配置的kafka服务器。它需要在实例化时执行此操作,因为Kafka将从服务器获取元数据(哪些主题可用,哪些是每个分区的前导,是否压缩数据,等等),所以只要有
producer.send()
请求,它就可以开始了。假设Kafka服务器已启动且可访问,则在接受连接的服务器上会有远程TCP套接字,在握手过程后,它们将在双方的已建立状态上稳定下来。根据Kafka版本和生产者的类型,还会有其他TCP连接请求发送到zookeeper服务,甚至可以选择发送到模式注册表服务器

如果Kafka/Zookeeper/其他服务器不可用,无论出于何种原因,它仍然需要在本地打开这些TCP套接字来启动请求,但它们永远不会达到已建立的状态。假设存在重试循环,套接字可能会被重用或建立新的套接字,直到建立连接或取消连接请求


因此,为了更直接地回答您的问题,假设连接请求被取消,如果卡夫卡制作人无法与卡夫卡通话,那么卡夫卡制作人应该在自己之后进行清理,并关闭它打开的所有套接字。据我所知,Kafka客户端从不使用Unix管道进行通信,到达Kafka服务器以生成或使用数据的唯一方法是通过TCP连接。

感谢您的详细解释,但我注意到它也在打开管道,将再次检查。问这个问题的原因是卡夫卡制作人没有关闭连接,因此我们有文件描述符泄漏,导致太多文件打开问题。现在我们找到了根本原因,这是slf4j版本的比赛失误。producer的close函数中有一条日志消息,它需要最新版本的slf4j,因此没有引发此类方法异常,连接也没有关闭。这是我们在本次论坛上提出这个问题后观察到的。谢谢