使用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:9092client.id=kfka-producersecurity.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
相关产品推荐
相关产品推荐

