You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本连接Docker Kafka容器遇NoBrokersAvailable错误求助

错误原因分析
  • Python代码配置被覆盖:你先初始化了带bootstrap_servers=['kafka:9092']的Producer实例,但紧接着又执行producer=KafkaProducer(),直接把配置好的实例替换成了默认参数的新实例(默认bootstrap地址是localhost:9092),导致Producer无法找到正确的Broker地址。
  • Kafka容器监听配置缺失:Debezium Kafka镜像需要显式配置ADVERTISED_LISTENERS,否则Broker会向客户端暴露容器内部的网络地址,外部客户端(比如宿主机上的Python代码)无法解析该地址,最终连接失败。
解决方法

修正Python代码

删除重复初始化Producer的代码,保留正确的配置(根据代码运行环境选择对应的bootstrap地址):

from kafka import KafkaProducer
import json
from csv import DictReader 

# 代码在宿主机运行时用['localhost:9092'],在Docker容器内(和Kafka同网络)用['kafka:9092']
bootstrap_servers = ['localhost:9092']
topicname='test-topic'

# 仅初始化一次Producer,可将序列化逻辑整合到初始化参数中
producer = KafkaProducer(
    bootstrap_servers=bootstrap_servers,
    value_serializer=lambda v: json.dumps(v).encode('utf-8')
)

with open('test_data_producer.csv', 'r') as new_obj:
   csv_dict_reader = DictReader(new_obj)
   for row in csv_dict_reader:
       ack = producer.send(topicname, row)
       metadata = ack.get()
       print(metadata.topic, metadata.partition)

修正Docker Compose配置

为Kafka容器添加监听地址相关环境变量,同时用depends_on替代过时的links:

kafka:
    container_name: kafka
    image: debezium/kafka:latest
    ports:
      - "0.0.0.0:9092:9092"
    depends_on:
      - zookeeper
    environment: 
      - ZOOKEEPER_CONNECT=zookeeper:2181
      - ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092,PLAINTEXT_INTERNAL://kafka:9092
      - LISTENERS=PLAINTEXT://0.0.0.0:9092,PLAINTEXT_INTERNAL://0.0.0.0:9093
      - INTER_BROKER_LISTENER_NAME=PLAINTEXT_INTERNAL
    volumes: 
        - ./kafka/data:/kafka/data
        - ./kafka/logs:/kafka/logs

参数说明:

  • LISTENERS:定义Kafka监听的端口,外部客户端用9092,Broker内部通信用9093
  • ADVERTISED_LISTENERS:告知客户端连接地址,宿主机用localhost:9092,Docker内部服务用kafka:9092
  • INTER_BROKER_LISTENER_NAME:指定Broker之间通信使用的监听地址

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:10:48