Kafka客户端收不到消息

Posted

技术标签:

【中文标题】Kafka客户端收不到消息【英文标题】:Kafka client can't receive messages 【发布时间】:2018-01-20 12:21:59 【问题描述】:

我在远程机器上设置了 kafka 和 zookeeper。在那台机器上,我可以看到下面使用官方网站上的测试方法工作。

> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic listings-incoming
This is a message
This is another message

> bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --listings-incoming --from-beginning
This is a message
This is another message

但是当我使用本地消费者脚本时,它不起作用:

bin/kafka-console-consumer.sh —bootstrap-server X.X.X.X:9092 —listings-incoming —from-beginning —consumer-property group.id=group2

没有看到消息显示,但显示的是:

[2017-08-11 14:39:56,425] 警告自动提交偏移量 listings-incoming-4=OffsetAndMetadataoffset=0, metadata='', listings-incoming-2=OffsetAndMetadataoffset= 0,元数据='',listings-incoming-3=OffsetAndMetadataoffset=0,metadata='',listings-incoming-0=OffsetAndMetadataoffset=0,metadata='',listings-incoming-1=组 group1 的 OffsetAndMetadataoffset=0, metadata='' 失败:无法完成提交,因为组已经重新平衡并将分区分配给另一个成员。这意味着后续调用 poll() 之间的时间比配置的 max.poll.interval.ms 长,这通常意味着轮询循环花费了太多时间处理消息。您可以通过增加会话超时或通过使用 max.poll.records 减少 poll() 中返回的批处理的最大大小来解决此问题。 (org.apache.kafka.clients.consumer.internals.ConsumerCoordinator)

**********************更新**********************

我的 zookeeper 和 kafka 在同一台机器上运行,现在我在 Advertisementd.listeners 上的配置是这样的:

advertised.listeners=PLAINTEXT://the.machine.ip.address:9092

我尝试将其更改为:

advertised.listeners=PLAINTEXT://my.client.ip.address:9092

然后运行客户端消费者脚本,它给出了错误:

[2017-08-11 15:49:01,591] WARN 获取元数据时出错 相关 ID 3:listings-incoming=LEADER_NOT_AVAILABLE (org.apache.kafka.clients.NetworkClient) [2017-08-11 15:49:22,106] 警告引导代理 10.161.128.238:9092 已断开连接 (org.apache.kafka.clients.NetworkClient) [2017-08-11 15:49:22,232] WARN 获取相关 id 为 7 的元数据时出错: listings-incoming=LEADER_NOT_AVAILABLE (org.apache.kafka.clients.NetworkClient) [2017-08-11 15:49:22,340] WARN 获取相关 id 为 8 的元数据时出错: listings-incoming=LEADER_NOT_AVAILABLE (org.apache.kafka.clients.NetworkClient) [2017-08-11 15:49:40,453] 警告引导代理 10.161.128.238:9092 已断开连接 (org.apache.kafka.clients.NetworkClient) [2017-08-11 15:49:40,531] WARN 获取相关 id 为 12 的元数据时出错: listings-incoming=LEADER_NOT_AVAILABLE (org.apache.kafka.clients.NetworkClient)

【问题讨论】:

检查您的主机名在/etc/hosts中是否配置正确,然后重试。 【参考方案1】:

您可能没有在 brokers server.properties 文件中正确配置您的 advertised.listeners

来自https://kafka.apache.org/documentation/

advertised.listeners 监听器发布到 ZooKeeper 供客户端 如果与上面的听众不同,请使用。在 IaaS 环境中,这 可能需要与代理绑定的接口不同。 如果未设置,将使用 listeners 的值。

在同一个文档中

listeners Listener List - 我们将监听的 URI 的逗号分隔列表 on 和侦听器名称。如果侦听器名称不是证券 协议,listener.security.protocol.map 也必须设置。指定 hostname 为 0.0.0.0 以绑定到所有接口。将主机名留空 绑定到默认界面。合法听众名单的例子: PLAINTEXT://myhost:9092,SSL://:9091 CLIENT://0.0.0.0:9092,REPLICATION://localhost:9093

因此,如果adverted.listeners 未设置并且侦听器只是在侦听localhost:9092 或127.0.0.1:9092 或0.0.0.0:9092,那么客户端将在发出元数据请求时被告知连接到localhost到引导服务器。当客户端实际上与代理在同一台机器上运行时,它可以工作,但是当您远程连接时它会失败。

您应该将 advertised.listeners 设置为运行代理的主机的完全限定域名或公共 IP 地址。

例如

advertised.listeners=PLAINTEXT://kafkabrokerhostname.confluent.io:9092

advertised.listeners=PLAINTEXT://192.168.1.101:9092

【讨论】:

嗨,汉斯,我确实试过了。我已经添加了一些更新,你可以看看吗?谢谢。 你需要公布kafka broker的IP,而不是客户端。确保您可以从客户端访问通告的主机和端口。例如,如果您来自客户端计算机的telnet the.machine.ip.address 9092,它会连接吗?您还可以确认您运行的是哪个版本的 Apache Kafka?

以上是关于Kafka客户端收不到消息的主要内容,如果未能解决你的问题,请参考以下文章

kafka最佳实践

C语言写的UDP客户端收不到包

java客户端向单机版kafka发送消息没有接收到

阅读来自 kafka 的最新消息-segmentio/kafka-go

kafka通过控制台模拟消息发送和消息接收正常,但是通过javaAPI操作生产者发送消息不成功 消费者接收不到数据解决方案?

手机锁屏后有时收不到微信通知,有时又能收到是怎么回事?