使用kafka-node向Kafka Producer发送消息报LeaderNotAvailable错误如何解决
Kafka LeaderNotAvailable错误修复方案
第一步:确认目标topic已正常创建
Kafka默认若关闭自动创建topic开关,向不存在的topic发送消息会直接触发LeaderNotAvailable错误。
先执行命令手动创建topic:
bin/kafka-topics.sh --create --topic catalog --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
再执行命令验证topic状态:
bin/kafka-topics.sh --describe --topic catalog --bootstrap-server localhost:9092
若输出中Leader字段值不为-1,说明topic选举正常。
第二步:修正Kafka服务端配置
虽然你已经修改过advertised.listeners,请确认server.properties中以下配置完全匹配:
# 内部监听地址,0.0.0.0允许所有主机访问 listeners=PLAINTEXT://0.0.0.0:9092 # 对外暴露的访问地址,和你代码里填的kafka_server完全一致 advertised.listeners=PLAINTEXT://localhost:9092 inter.broker.listener.name=PLAINTEXT # 若没有自定义zookeeper端口,保持默认即可 zookeeper.connect=localhost:2181
修改配置后必须按顺序重启服务:先停止Kafka,再停止Zookeeper,然后先启动Zookeeper,等待10秒完全启动后再启动Kafka,Kafka启动完成后等待30秒再运行NodeJS代码。
第三步:调整NodeJS客户端配置
修改kafka-node初始化参数,添加可靠性配置:
// 修改KafkaClient初始化参数 const client = new kafka.KafkaClient({ kafkaHost: config.kafka_server, requestTimeout: 5000, autoConnect: true }); // 修改Producer初始化参数 const producer = new Producer(client, { requireAcks: 1, ackTimeoutMs: 1000 });
第四步:验证Kafka本身可用性
若以上步骤都无效,先用Kafka自带脚本验证服务本身是否正常:
- 启动控制台生产者,输入任意消息回车发送:
bin/kafka-console-producer.sh --topic catalog --bootstrap-server localhost:9092
- 另开终端启动控制台消费者,看是否能收到刚才发送的消息:
bin/kafka-console-consumer.sh --topic catalog --from-beginning --bootstrap-server localhost:9092
如果脚本收发消息正常,说明是客户端代码问题;如果脚本也报错,说明Kafka服务部署有问题,可删除Kafka日志目录和Zookeeper数据目录后重新启动服务初始化。
内容的提问来源于stack exchange,提问作者Shruti Bhambhani
相关产品推荐
相关产品推荐

