背景
在服务器上搭建了一个单机环境的kafka broker,在服务器上使用命令生产消息时,一切正常。当在本地使用JAVA程序发送消息时,一直出错。
抛出的错误为:
Exception in thread "main" Failed to send requests for topics test with correlation ids in [0,12]
kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
问题追踪
最初怀疑是防火墙限制了端口,因此在本地使用telnet连接服务器端口,发现无法连接,因此关闭服务器防火墙。重试,还是抛同样的问题。
后来查看kafka日志,发现TCP连接可以正常关闭,而且IP也是客户端的IP,证明网络没问题,客户端确实可以连上kafka服务器。
那到底是什么问题呢?
通过查看kafka配置,发现有个属性:advertised.host.name。官方文档里的备注信息表明,该字段的值是生产者和消费者使用的。如果没有设置,则会取host.name的值,默认情况下,该值为localhost。思考一下,如果生产者拿到localhost这个值,只往本地发消息,必然会报错(因为本地没有kafka服务器)。
问题处理
将advertised.host.name设置为服务器IP地址ÿ