Node.js远程连接Apache Kafka失败,请求技术支持
解决Node.js远程连接Ubuntu Kafka的生产消费问题
看起来你遇到的核心问题是Kafka监听配置错误、IP地址不匹配,还有潜在的分区配置问题,我来一步步帮你排查解决:
1. 修复Kafka server.properties的配置错误
你当前的advertised.listeners写了两行重复配置,这是无效的,而且配置里的IP和你Node.js代码中使用的192.168.1.104不一致,这是导致连接失败的关键!
打开Ubuntu上的config/server.properties,做如下修改:
# 让Kafka监听所有网卡的9092端口,允许本地和远程设备连接 listeners=PLAINTEXT://0.0.0.0:9092 # 告诉远程客户端(Windows)要连接的Kafka实际IP,必须和你Node.js代码里的IP完全一致 advertised.listeners=PLAINTEXT://192.168.1.104:9092
修改完成后,重启Kafka服务生效:
# 先停止Kafka bin/kafka-server-stop.sh # 再后台启动Kafka bin/kafka-server-start.sh config/server.properties &
2. 检查Ubuntu防火墙和网络连通性
远程连接失败大概率和端口未开放或网络不通有关:
- 先确认Ubuntu的实际内网IP:执行
ip addr或ifconfig查看,确保和你代码里的192.168.1.104一致。 - 在Windows端测试网络:
- 打开命令提示符,执行
ping 192.168.1.104,如果能收到回复说明网络互通。 - 执行
telnet 192.168.1.104 9092,如果能成功连接说明端口开放;如果失败,在Ubuntu上开放9092端口:sudo ufw allow 9092/tcp sudo ufw reload
- 打开命令提示符,执行
3. 修复生产者代码的分区问题
你生产者代码里指定了partition: 2,但默认创建的Topic分区数是1(分区编号从0开始),这会导致消息发送失败,返回undefined。有两种解决方式:
- 方式一:删除现有Topic,重新创建带足够分区的Topic:
bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic topic1 bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic topic1 - 方式二:去掉生产者代码里的
partition参数,让Kafka自动分配分区:payloads = [ { topic: 'topic1', messages: 'hi' } ];
4. 检查kafka-node版本兼容性
你使用的Node.js 8.11.0是较旧的版本,部分新版本的kafka-node已不再支持Node.js 8。建议安装兼容的版本:
npm uninstall kafka-node npm install kafka-node@4.1.3
验证修复效果
- 重启Windows端的生产者和消费者代码。
- 如果生产者控制台不再输出
undefined,而是输出类似{ topic1: { '2': 123 } }的内容,说明消息生产成功。 - 消费者能收到
hi消息,说明消费流程正常。
内容的提问来源于stack exchange,提问作者Bhaskar Sen
相关产品推荐
相关产品推荐

