【问题标题】:Does Java KafkaProducer open any sockets and pipes even when the KafkaProdcucer is not able to connect to kafka for some reason?即使 KafkaProdcucer 由于某种原因无法连接到 kafka,Java KafkaProducer 是否会打开任何套接字和管道?
【发布时间】:2019-08-07 14:08:47
【问题描述】:

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

【问题讨论】:

    标签: java apache-kafka kafka-producer-api


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的详细解释,但我观察到它也在打开管道,将再次检查。问这个问题的原因是 kafka 生产者没有关闭连接,因此我们有文件描述符泄漏,导致打开文件过多的问题。现在我们找到了根本原因,它是 slf4j 版本未匹配。 producer的close函数中有一条log信息,并且需要最新版本的slf4j,所以没有抛出该方法异常,连接也没有关闭。这是我们在这个论坛上提出这个问题后观察到的。谢谢。
    猜你喜欢
    • 2021-07-08
    • 2018-12-05
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多