我使用以下Kafka Docker映像:https://hub.docker.com/r/wurstmeister/kafka/
我可以使用以下属性启动Apache Kafka:
<KAFKA_ADVERTISED_HOST_NAME>${local.ip}</KAFKA_ADVERTISED_HOST_NAME>
<KAFKA_ADVERTISED_PORT>${kafka.port}/KAFKA_ADVERTISED_PORT>
<KAFKA_ZOOKEEPER_CONNECT>zookeeper:2181</KAFKA_ZOOKEEPER_CONNECT>
<KAFKA_MESSAGE_MAX_BYTES>15000000</KAFKA_MESSAGE_MAX_BYTES>
但是尝试将消息发送到主题时,我看到以下警告:
WARN 9248 --- [ad | producer-1] org.apache.kafka.clients.NetworkClient : [Producer clientId=producer-1] Error while fetching metadata with correlation id 4 : {post.sent=LEADER_NOT_AVAILABLE}
我在互联网上看到几篇文章,告诉您此问题可能与诸如KAFKA_ADVERTISED_HOST_NAME
和KAFKA_ADVERTISED_PORT
之类的旧属性有关,我应该重新配置为KAFKA_ADVERTISED_LISTENERS
和KAFKA_LISTENERS
。但是,当我使用以下属性启动Kafka容器时:
<KAFKA_ADVERTISED_LISTENERS>PLAINTEXT://${local.ip}:${kafka.port}</KAFKA_ADVERTISED_LISTENERS>
<KAFKA_LISTENERS>PLAINTEXT://${local.ip}:${kafka.port}</KAFKA_LISTENERS>
<KAFKA_ZOOKEEPER_CONNECT>zookeeper:2181</KAFKA_ZOOKEEPER_CONNECT>
<KAFKA_MESSAGE_MAX_BYTES>15000000</KAFKA_MESSAGE_MAX_BYTES>
我的应用程序无法连接到Kafka:
2018-08-25 16:20:57.407 INFO 17440 --- [ main] o.a.kafka.common.utils.AppInfoParser : Kafka version : 1.1.0
2018-08-25 16:20:57.408 INFO 17440 --- [ main] o.a.kafka.common.utils.AppInfoParser : Kafka commitId : fdcf75ea326b8e07
2018-08-25 16:20:58.513 WARN 17440 --- [| adminclient-1] org.apache.kafka.clients.NetworkClient : [AdminClient clientId=adminclient-1] Connection to node -1 could not be established. Broker may not be available.
2018-08-25 16:20:59.567 WARN 17440 --- [| adminclient-1] org.apache.kafka.clients.NetworkClient : [AdminClient clientId=adminclient-1] Connection to node -1 could not be established. Broker may not be available.
如何正确重新配置Docker Kafka以便能够使用KAFKA_ADVERTISED_LISTENERS
和KAFKA_LISTENERS
?
答案 0 :(得分:0)
从这个很棒的 post 中,这里有一个关于这些属性的很好的解释:
<块引用>LISTENERS 是 Kafka 绑定的接口。 ADVERTISED_LISTENERS 是客户端连接的方式。
当您的应用程序连接到来自LISTENER的地址之一时,Kafka将通讯者KAFKA_ADVERTISED_LISTENER返回到您选择的那个LISTENER。返回的 KAFKA_ADVERTISED_LISTENER 是您的应用程序将真正用于与 Kafka 通信的地址。
因此,您必须在您的应用程序中使用您在 LISTENERS Kafka 属性上为 PLAINTEXT 设置的内容。
按原样使用此配置:
<KAFKA_ADVERTISED_LISTENERS>PLAINTEXT://${local.ip}:${kafka.port}</KAFKA_ADVERTISED_LISTENERS>
<KAFKA_LISTENERS>PLAINTEXT://${local.ip}:${kafka.port}</KAFKA_LISTENERS>
您必须在您的应用程序中使用:
正如您在 Kafka docker ${local.ip}:${kafka.port} 上使用的那样,您必须获取分配的 kafka docker 容器 IP 并在您的应用程序中使用它强>.
为了填充此场景的变量,假设您的 kafka docker 容器 IP 为 192.250.0.1,使用的 kafka 端口为 9092,因此您的应用程序 bootstrap.servers 属性将为:192.250.0.1:9092强>
这是一个命令,用于查看当您尝试使用 kafka 的侦听器之一进行连接时 Kafka 返回给您的内容:
$ kafkacat -b 192.250.0.1:9092 -L
kafkacat 是一个非常有用的测试和调试 kafka 的工具。