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

从本地向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代码运行在宿主机上

  1. 修正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
  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)
  1. 重新启动docker-compose服务,等待Kafka完全启动后再运行代码即可。

场景2:Scala代码运行在同一个Docker网络的容器中

  1. 不需要修改docker-compose的端口配置,确保Scala代码容器和Kafka在同一个Docker compose定义的网络下,或者手动加入Kafka所在的Docker网络。
  2. 确认Kafka容器完全启动后再运行代码即可,当前的bootstrap.servers配置kafka:9092可以正常使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:45:04