【问题标题】:Kafka consumer cannot consumer from external Kafka serverKafka 消费者无法从外部 Kafka 服务器消费
【发布时间】:2018-10-31 07:31:17
【问题描述】:

我在物理服务器中运行 Zookeeper 和 Kafka,并且我构建了一个运行 Java 应用程序的 docker 容器,以作为消费者连接到外部 Kafka。

Kafka 监听端口:

[helio@dev-01 kafka]$ netstat -an|grep 9092
tcp6       0      0 :::9092                 :::*                    LISTEN

我正在使用 docker 共享网络,但消费者应用程序无法连接到 kafka。 我可以看到我可以从容器内部访问kafka IP...我尝试了一个简单的方法来查看我可以从网络访问kafka服务器:

在容器处:

root@ff419d41540a:~# ssh -p 9092 192.168.1.251

在 Kafka 日志中我可以看到测试连接:

[2018-05-21 12:33:39,093] WARN [SocketServer brokerId=0] Unexpected error from /172.17.0.2; closing connection (org.apache.kafka.common.network.Selector)
org.apache.kafka.common.network.InvalidReceiveException: Invalid receive (size = 1397966893 larger than 104857600)
        at org.apache.kafka.common.network.NetworkReceive.readFromReadableChannel(NetworkReceive.java:132)
        at org.apache.kafka.common.network.NetworkReceive.readFrom(NetworkReceive.java:93)
        at org.apache.kafka.common.network.KafkaChannel.receive(KafkaChannel.java:235)
        at org.apache.kafka.common.network.KafkaChannel.read(KafkaChannel.java:196)
        at org.apache.kafka.common.network.Selector.attemptRead(Selector.java:557)
        at org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:495)
        at org.apache.kafka.common.network.Selector.poll(Selector.java:424)
        at kafka.network.Processor.poll(SocketServer.scala:628)
        at kafka.network.Processor.run(SocketServer.scala:545)
        at java.lang.Thread.run(Thread.java:748)

那么,这有什么限制吗?一些端口值限制?

如果我使用 --network=host(主机网络)启动消费者 Docker 容器,那么消费者应用程序能够连接到 Kafka 并且工作正常。

谢谢

【问题讨论】:

    标签: docker apache-kafka kafka-consumer-api


    【解决方案1】:

    我可以在 Kafka 消费者库上启用更多日志,以便找出问题所在。 甚至使用 IP:Port 来定义 Kafka 服务器,如日志所示:

    16:34:04.670 [main] INFO  o.a.k.c.consumer.ConsumerConfig - ConsumerConfig     values:
            auto.commit.interval.ms = 5000
            auto.offset.reset = latest
            bootstrap.servers = [192.168.1.251:9092]
    

    但是另一个 kafka 消费者日志显示它正在获取主机名(物理服务器),一旦容器无法解析该名称,消费者就会失败:

    16:34:08.861 [Consumer] INFO  o.a.k.c.c.i.AbstractCoordinator - [Consumer clientId=consumer-1, groupId=messageRouterConsumer] Group coordinator dev-01:9092 (id: 2147483647 rack: null) is unavailable or invalid, will attempt rediscovery
    

    所以我可以解决这个问题,将 kafka 主机名服务器添加到容器 /etc/hosts 中:

    echo "192.168.1.251   dev-01" >> /etc/hosts
    

    然后容器内的 Kafka Consumer 应用程序开始从主题消费。

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 2019-11-21
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 2020-05-23
      • 2017-09-23
      • 1970-01-01
      • 2020-07-10
      相关资源
      最近更新 更多