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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:40:27