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

使用librdkafka向Bitnami Kafka生产消息时ApiVersion请求断开报错

使用librdkafka连接Bitnami Kafka容器时生产消息失败的问题

我通过Docker的bitnami/kafka镜像部署了Kafka broker,明文安全模式下,Kotlin(Java)客户端和Python客户端均可正常连接并收发消息,且在三种场景下均能正常工作:同一compose的容器内、独立容器内、未容器化的Windows 11主机上。

我需要在C++应用中集成Kafka生产者,因此引入了librdkafka。但每当尝试用极简生产者生产消息时,总会报错:

Disconnected while requesting ApiVersion: might be caused by incorrect security.protocol configuration (connecting to a SSL listener?) or broker version is < 0.10 (see api.version.request)

通过Wireshark抓包发现,librdkafka与另外两个客户端的行为差异明显:创建RD_KAFKA_PRODUCER时能连接到broker,请求Kafka Metadata v12并收到响应,状态从APIVERSION_QUERY -> UP(相关日志如下);但尝试生产消息时,客户端会陷入重复获取元数据并失败的循环。

我的C++应用运行在Alpine Linux 3.19.0容器中,已测试预编译版本的librdkafka(2.5.0版),也尝试过下载源码编译安装(2.5.0-2版),编译参数为:

./configure --enable-zlib --enable-zstd --enable-ssl --enable-gssapi --enable-curl --disable-lz4-ext

我在三个应用中使用相同配置:

  • bootstrap.servers=192.168.1.106:9092
  • client.id=kfka-producer
  • security.protocol=PLAINTEXT

请问我遗漏了哪些配置?该行为的原因是什么?


生产者创建阶段相关日志

%7|1724746409.258|CONNECT|kafka-producer-1#producer-1| [thrd:192.168.1.106:9092/bootstrap]: 192.168.1.106:9092/bootstrap: Connected to ipv4#192.168.1.106:9092
%7|1724746409.258|CONNECTED|kafka-producer-1#producer-1| [thrd:192.168.1.106:9092/bootstrap]: 192.168.1.106:9092/bootstrap: Connected (#1)
%7|1724746409.258|FEATURE|kafka-producer-1#producer-1| [thrd:192.168.1.106:9092/bootstrap]: 192.168.1.106:9092/bootstrap: Updated enabled protocol features +ApiVersion to ApiVersion
%7|1724746409.258|STATE|kafka-producer-1#producer-1| [thrd:192.168.1.106:9092/bootstrap]: 192.168.1.106:9092/bootstrap: Broker changed state CONNECT -> APIVERSION_QUERY
%7|1724746409.261|FEATURE|kafka-producer-1#producer-1| [thrd:192.168.1.106:9092/bootstrap]: 192.168.1.106:9092/bootstrap: Updated enabled protocol features to MsgVer1,ApiVersion,BrokerBalancedConsumer,ThrottleTime,Sasl,SaslHandshake,BrokerGroupCoordinator,LZ4,OffsetTime,MsgVer2,IdempotentProducer,ZSTD,SaslAuthReq
%7|1724746409.261|STATE|kafka-producer-1#producer-1| [thrd:192.168.1.106:9092/bootstrap]: 192.168.1.106:9092/bootstrap: Broker changed state APIVERSION_QUERY -> UP
%7|1724746409.263|BROKER|kafka-producer-1#producer-1| [thrd:main]: 127.0.0.1:9092/1: Added new broker with NodeId 1
%7|1724746409.263|CLUSTERID|kafka-producer-1#producer-1| [thrd:main]: 192.168.1.106:9092/bootstrap: ClusterId update "" -> "RzgGhnlKRPOQXG-JIwto6g"
%7|1724746409.263|CONTROLLERID|kafka-producer-1#producer-1| [thrd:main]: 192.168.1.106:9092/bootstrap: ControllerId update -1 -> 1
%7|1724746409.263|BRKMAIN|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Enter main broker thread

尝试生产消息后的相关日志

%7|1724746594.290|STATE|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Broker changed state INIT -> TRY_CONNECT
%7|1724746594.290|CONNECT|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: broker in state TRY_CONNECT connecting
%7|1724746594.290|STATE|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Broker changed state TRY_CONNECT -> CONNECT
%7|1724746594.290|CONNECT|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Connecting to ipv4#127.0.0.1:9092 (plaintext) with socket 17
%7|1724746594.290|TOPPAR|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: transactional-registers [0] 1 message(s) queued but broker not up
%7|1724746594.290|CONNECT|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Connected to ipv4#127.0.0.1:9092
%7|1724746594.290|CONNECTED|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Connected (#1)
%7|1724746594.290|FEATURE|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Updated enabled protocol features +ApiVersion to ApiVersion
%7|1724746594.290|STATE|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Broker changed state CONNECT -> APIVERSION_QUERY
%7|1724746594.290|TOPPAR|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: transactional-registers [0] 1 message(s) queued but broker not up
%7|1724746594.290|TOPPAR|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: transactional-registers [0] 1 message(s) queued but broker not up
%7|1724746594.291|FAIL|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Disconnected while requesting ApiVersion: might be caused by incorrect security.protocol configuration (connecting to a SSL listener?) or broker version is < 0.10 (see api.version.request) (after 1ms in state APIVERSION_QUERY) (_TRANSPORT)
%6|1724746594.291|FAIL|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Disconnected while requesting ApiVersion: might be caused by incorrect security.protocol configuration (connecting to a SSL listener?) or broker version is < 0.10 (see api.version.request) (after 1ms in state APIVERSION_QUERY)
%7|1724746594.291|FEATURE|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Updated enabled protocol features -ApiVersion to 
%7|1724746594.292|STATE|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Broker changed state APIVERSION_QUERY -> DOWN
%7|1724746594.292|STATE|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Broker changed state DOWN -> INIT
%7|1724746594.292|STATE|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Broker changed state INIT -> TRY_CONNECT
%7|1724746594.292|RECONNECT|kafka-producer-1#producer-1| [thrd:127.0.0.1:9092/1]: 127.0.0.1:9092/1: Delaying next reconnect by 274ms

客户端创建代码

// Configuration
rd_kafka_conf_t *kafka_conf = rd_kafka_conf_new();
// Parameters are copied from a YAML file:
// bootstrap.servers=localhost:9092
// security.protocol=PLAINTEXT
// log_level=7
// api.version.request=true

// Producer
producer = rd_kafka_new(RD_KAFKA_PRODUCER, kafka_conf, errstr, sizeof(errstr));

// Messages are sent to the queue using:
err = rd_kafka_producev(
    producer,
    RD_KAFKA_V_TOPIC(topic_name),
    RD_KAFKA_V_MSGFLAGS(RD_KAFKA_MSG_F_COPY),
    RD_KAFKA_V_VALUE((void *) message_content.c_str(), message_content.size()),
    RD_KAFKA_V_OPAQUE(NULL),
    RD_KAFKA_V_END);

内容的提问来源于stack exchange,提问作者V.Lorz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 03:30:54