Docker环境下跨容器的Spring Boot应用无法向Kafka发布事件如何解决
你遇到的超时错误是Kafka监听器配置的协议名称不匹配导致的,同时配置中混用了已废弃的旧版本广播参数,进一步引发了服务发现异常,可按以下步骤修复:
修复步骤
- 修正kafka服务的环境变量配置,统一监听器协议名称,删除废弃参数
原配置中KAFKA_LISTENERS用了INTERNAL协议名,KAFKA_ADVERTISED_LISTENERS却用了PLAINTEXT协议名,两者不匹配;同时KAFKA_ADVERTISED_HOST_NAME、KAFKA_ADVERTISED_PORT是Kafka 0.9.x版本后的废弃参数,和新的LISTENERS配置冲突,直接删除即可。修正后的kafka配置段参考:
kafka: image: wurstmeister/kafka container_name: kafka hostname: kafka ports: - "9092:9092" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT depends_on: - zookeeper
- 确认目标topic已存在
进入kafka容器执行以下命令创建topic,避免自动创建topic耗时过长导致消息超时:
kafka-topics.sh --create --topic wages-local --bootstrap-server kafka:9092 --partitions 1 --replication-factor 1
- 调整Spring Boot Kafka生产者配置做验证
测试阶段可以将producer的acks参数设为1,关闭幂等性配置,避免单节点Broker无副本导致的提交等待超时。
修改完配置后重启所有容器即可正常发送消息。
内容的提问来源于stack exchange,提问作者Aleksei
相关产品推荐
相关产品推荐

