Debezium/Kafka(无Zookeeper)无法通过C#代码连接问题求助
解决C#连接Debezium/Kafka(KRaft模式)的连接错误
问题根源分析
从你的配置和错误信息来看,核心问题集中在Kafka的KRaft模式配置不完整,以及内部监听器地址不匹配,导致客户端无法正常完成API版本协商。
修正步骤
1. 修复Docker Compose配置
调整docker-compose.yml,补充KRaft模式必要的角色配置,修正内部监听器地址:
version: '2' services: kafka-1: image: debezium/kafka:1.7 ports: - "29092:29092" - "9092:9092" environment: - CLUSTER_ID=5Yr1SIgYQz-b-dgRabWx4g - BROKER_ID=1 # 新增:指定节点同时承担broker和controller角色(KRaft模式必需) - KAFKA_CFG_PROCESS_ROLES=broker,controller - KAFKA_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9092 - ALLOW_PLAINTEXT_LISTENER=yes - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:29092,CONTROLLER://:9093 # 修正:内部监听器地址匹配容器服务名kafka-1 - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka-1:9092,EXTERNAL://localhost:29092 - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=CLIENT # 新增:指定controller使用的监听器 - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
2. 调整C#生产者配置
显式指定安全协议,避免自动协商时的协议不匹配问题:
using Confluent.Kafka; using Newtonsoft.Json; var config = new ProducerConfig { BootstrapServers = "localhost:29092", // 显式指定明文协议,与Kafka监听器配置对齐 SecurityProtocol = SecurityProtocol.Plaintext, // 强制启用API版本请求,兼容低版本Kafka协商逻辑 ApiVersionRequest = true }; using var producer = new ProducerBuilder<Null, string>(config).Build(); try { string? state; while ((state = Console.ReadLine()) != null){ var value = JsonConvert.SerializeObject(new Weather(state, 70)); var response = await producer.ProduceAsync("weather-topic", new Message<Null, string>{Value = value}); Console.WriteLine($"消息已发送:分区 {response.Partition},偏移量 {response.Offset}"); } } catch (ProduceException<Null, string> exc) { Console.WriteLine($"发送失败:{exc.Error.Reason}"); } public record Weather(string State, int Temperature);
3. 验证操作
- 清理旧容器:
docker-compose down -v - 启动新容器:
docker-compose up -d - 等待1分钟让Kafka集群稳定,再运行C#代码测试连接
关键说明
Debezium Kafka 1.7基于Kafka 2.8.x(首个支持KRaft的稳定版本),配置时必须:
- 明确指定
PROCESS_ROLES包含controller,否则无法在无ZK模式下启动集群 CONTROLLER_QUORUM_VOTERS的地址必须与容器服务名一致- 外部客户端必须使用
EXTERNAL监听器的localhost:29092地址连接
内容的提问来源于stack exchange,提问作者cod
相关产品推荐
相关产品推荐

