KafkaJS连Docker Kafka报Failed to connect to seed broker
问题根因
报错getaddrinfo ENOTFOUND broker的核心原因是主机名解析失败:
broker是Docker Compose为Kafka容器分配的内部网络域名,仅在当前compose创建的容器内网环境下可被识别解析- 你在宿主机直接运行
node producer.js,宿主机的DNS系统不存在broker对应的地址记录,自然无法建立连接
修复方法
直接修改producer.js中的Kafka连接配置,将broker地址替换为宿主机可访问的监听地址即可:
const { Kafka } = require('kafkajs') const kafka = new Kafka({ clientId: 'my-app', brokers: ['localhost:9092'], // 将原配置中的broker:9092替换为localhost:9092 }) const producer = kafka.producer() const main = async () => { await producer.connect() await producer.send({ topic: 'quickstart', messages: [ { value: 'Hello KafkaJS user!' }, ], }) await producer.disconnect() } main();
配置逻辑说明
你当前docker-compose中配置的两个advertised listener本身逻辑是正确的,分工如下:
PLAINTEXT_INTERNAL://broker:29092:供同Docker网络内的其他服务(比如你注释掉的kafka_ui、其他容器内部署的应用)访问Kafka使用PLAINTEXT://localhost:9092:供宿主机、外部网络的客户端访问Kafka使用,已经通过端口映射把容器的9092端口绑定到了宿主机9092端口,宿主机直接访问localhost:9092即可正常通信
改完配置后重新执行node producer.js即可正常发送消息,不会再触发域名解析失败的报错。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

