【发布时间】:2019-03-07 18:50:49
【问题描述】:
我在使用 kafka-streams 和 spring-kafka 应用程序时遇到了同样的问题。第一个是使用 kafka-clients:1.0.0 库,而另一个是 1.0.2 版本
kubernetes 中只有一个代理实例在运行 (KAFKA_ADVERTISED_LISTENERS="PLAINTEXT://${POD_IP}:9092")。它是有状态的,它是通过无头服务内部端点从客户端应用程序访问的(尽管我已经尝试过集群 ip 并且问题是一样的)
一旦我删除了这个 kafka pod 并重新创建它,我的客户端应用程序就无法重新连接。 Pod 确实是用另一个 IP 地址重新创建的,但由于我通过服务内部端点访问它,我希望我的客户端应用程序能够解析这个新地址,但它没有发生。
kafka-clients 库正在记录“发现负载最少的节点 [old_ip]:9092 (id: 0 rack: null)”,而此地址上不再运行任何内容
JVM TTL 缓存不是问题,因为我已将其设置为定期刷新。
重启客户端应用解决问题
如果在 KAFKA_ADVERTISED_LISTENERS 中提供 {POD_IP} 会导致此问题,那么提供 pod 的主机名会解决此问题吗?或者有没有办法指导我的客户解析这个新地址?
【问题讨论】:
-
你解决了这个问题吗?如果您发布后续内容,将对我有所帮助。
-
嗯,有点。当 java 客户端最初连接到代理时,它会获取 KAFKA_ADVERTISED_LISTENERS 中规定的值并继续使用它来连接到代理。因为我在那里有 {POD_ID},所以它总是 IP 地址。一旦 pod 重新启动并更改了它的 ip 地址,客户端将无法再找到它,因为它继续使用以前的 ip 地址。我的猜测仍然是提供 {POD_HOSTNAME} 而不是 {POD_IP} 可以解决问题,但我从未验证过它,所以我从来没有跟进