kafka发送消息失败错误

问题

在模拟进行kafka的生产者发送消息时,发送完消息消费者迟迟接收不到。等到了6000ms超时时间时,生产者端报超时
生产者报错

 ERROR Error when sending message to topic gaofengTest2 with key: null, value: 4 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms.

分析问题

因为这套kafka不是自己部署的而是公司的测试环境(用的是HDP),不太熟悉配置参数。
所以就只能硬着头皮顺着生产者的报错、kafka的日志去找了
看了kafka/logs/下的server、controller、kafka.err日志根本没动静。初步估计是producer连接出现问题
查看ambari界面中的broker的配置参数
在这里插入图片描述
很尴尬,测试环境貌似只是将kafka服务开通了,但是具体的broker等参数没有配置。上图红框中的配置参数在kafka/config/server.properties文件中

broker中的listeners参数代表的是监听的地址端口,如果配置错误,生产者就会连接超时

其中"PLAINTEXT"表示网络协议,在listeners中协议可选的值有PLAINTEXT和SSL,后面的IP地址也可以用"0.0.0.0"表示对所有的网络接口有效,如果IP地址为空表示只对默认的网络接口有效,

事实上还有一个参数advertised.listeners=PLAINTEXT://h110:9092,此参数与listeners=PLAINTEXT://h110:9092的配置
分为如下这几种情况:

  1. 如果advertised.listeners参数没设置的话,就使用listeners的配置然后发送给消息的生产者和消费者,这个过程其实是生产者和消费者在获取源数据(metadata)。
  2. 如果两个参数都没配置,那么就使用java.net.InetAddress.getCanonicalHostName()返回的值,对于ipv4,基本就是localhost了。

但是无论哪种情况,地址必须配对,只要这个参数不正确,就会导致生产者就会一直卡死,没有反应,因此只需要把listeners的地址修改成你的服务器地址即可

解决

将参数修改为listeners=PLAINTEXT://h110:9092之后

生产者端模拟如下:
在这里插入图片描述
消费者模拟如下:
在这里插入图片描述
模拟成功!

发布了15 篇原创文章 · 获赞 28 · 访问量 1140

猜你喜欢

转载自blog.csdn.net/qq_37865420/article/details/103770354