从本地向Docker部署的Kafka消费者发消息时构造生产者失败如何解决
错误原因
- 网络访问不匹配:配置的
bootstrap.servers值为kafka:9092,该域名仅支持和Kafka容器在同一个Docker自定义网络内的服务解析访问。如果Scala代码直接运行在宿主机、没有加入Docker对应网络,宿主机无法识别kafka域名,直接导致生产者初始化失败。 - Docker端口映射配置错误:docker-compose.yml中Kafka的端口映射配置为
9092:9092,但KAFKA_ADVERTISED_LISTENERS里对外暴露的宿主机监听端口是29092,二者端口不匹配,即使域名解析正常也无法建立连接。 - 额外排查点:如果上述配置无问题仍报错,可检查项目依赖的Kafka客户端版本,与Confluent镜像对应的Kafka版本差异过大也会导致初始化失败。
解决方法
根据代码运行环境选择对应方案即可:
场景1:Scala代码运行在宿主机上
- 修正docker-compose.yml中Kafka的端口映射配置,和
KAFKA_ADVERTISED_LISTENERS的PLAINTEXT_HOST配置对应:
kafka: image: confluentinc/cp-kafka:latest depends_on: - zookeeper ports: - 29092:29092 # 修改此处端口匹配对外暴露的监听端口 environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
- 修改Scala代码中的
bootstrap.servers配置为宿主机访问地址:
val props = new Properties() props.put("bootstrap.servers", "localhost:29092") // 修改此处为宿主机访问地址 props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer") props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer") val producer = new KafkaProducer[String, String](props)
- 重新启动docker-compose服务,等待Kafka完全启动后再运行代码即可。
场景2:Scala代码运行在同一个Docker网络的容器中
- 不需要修改docker-compose的端口配置,确保Scala代码容器和Kafka在同一个Docker compose定义的网络下,或者手动加入Kafka所在的Docker网络。
- 确认Kafka容器完全启动后再运行代码即可,当前的
bootstrap.servers配置kafka:9092可以正常使用。
内容的提问来源于stack exchange,提问作者moez skanjii
相关产品推荐
相关产品推荐

