kafka Producer 异常记录

半腔热情 提交于 2020-01-07 04:54:05

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

Failed to send producer request with correlation id 11 to broker 0 with data for partitions [my-topic,1]

解决办法:修改kafka service配置文件加入advertised.host.name=服务器ip地址

把值设置为空的话会kafka监听端口在所有的网卡上绑定。但是在外网访问时,客户端又遇到了java.nio.channels.ClosedChannelException异常信息,server端用tcpdump分析的时候发现客户端有传递kafka所在机器的机器名过来。在client里断点跟踪一下发现是findLeader的时候返回的元信息是机器名而不是IP。客户端无法解析这个机器名所以出现了前面的异常。

在server.properties 里还有另一个参数是解决这个问题的advertised.host.name

参数用来配置返回的host.name值,把这个参数配置为外网IP地址即可。这个参数默认没有启用,默认是返回的java.net.InetAddress.getCanonicalHostName的值,在我的电脑上这个值并不等于hostname的值而是返回IP,但在linux上这个值就是hostname的值。

除了IP之外,还有PORT,外网对应的PORT也需要修改。以下是server.properties文件对应位置。

当Kafka broker启动时,它会在ZK上注册自己的IP和端口号,客户端就通过这个IP和端口号来连接。

在AWS这种IaaS环境下,由于java.net.InetAddress.getCanonicalHostName调用拿到的HostName是类似ip-172-31-10-199这样的只有内网才能访问到的主机名,所以默认注册到ZK上的IP是内网才能访问的内网IP。

此时就需要显示指定 advertised.host.name, advertised.listeners参数,让注册到ZK上的IP是外网IP。

例如对于 59.64.11.22 IP对应的broker,需要在 server.properties 配置文件里增加如下三个配置:

新版配置
advertised.listeners=PLAINTEXT://59.64.11.22:9092

最新版本0.10.x broker配置弃用了advertised.host.name 和 advertised.port 这两个个配置项,就配置advertised.listeners就可以了。

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!