kafka消费者发消息失败

本文解决了一个常见的Kafka生产者错误,当尝试使用kafka-console-producer.sh向testTopic主题发送消息时,遇到LEADER_NOT_AVAILABLE警告。通过修改server.properties文件并添加容器IP地址,可以解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错如下

./kafka-console-producer.sh --broker-list 容器ip:9092 --topic testTopic
>1
[2020-04-01 01:42:01,606] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 1 : {testTopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2020-04-01 01:42:01,698] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 2 : {testTopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2020-04-01 01:42:01,812] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 3 : {testTopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2020-04-01 01:42:01,921] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 4 : {testTopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2020-04-01 01:42:02,029] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 5 : {testTopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2020-04-01 01:42:02,152] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 6 : {testTopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2020-04-01 01:42:02,260] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 7 : {testTopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2020-04-01 01:42:02,374] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 8 : {testTopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2020-04-01 01:42:02,481] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 9 : {testTopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2020-04-01 01:42:02,594] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 10 : {testTopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2020-04-01 01:42:02,704] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 11 : {testTopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2020-04-01 01:42:02,811] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 12 : {testTopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2020-04-01 01:42:02,923] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 13 : {testTopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2020-04-01 01:42:03,037] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 14 : {testTopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
^Corg.apache.kafka.common.KafkaException: Producer closed while send in progress
    at org.apache.kafka.clients.producer.KafkaProducer.doSend(KafkaProducer.java:888)
    at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:865)
    at kafka.tools.ConsoleProducer$.send(ConsoleProducer.scala:75)
    at kafka.tools.ConsoleProducer$.main(ConsoleProducer.scala:57)
    at kafka.tools.ConsoleProducer.main(ConsoleProducer.scala)
Caused by: org.apache.kafka.common.KafkaException: Requested metadata update after close
    at org.apache.kafka.clients.producer.internals.ProducerMetadata.awaitUpdate(ProducerMetadata.java:104)
    at org.apache.kafka.clients.producer.KafkaProducer.waitOnMetadata(KafkaProducer.java:1029)
    at org.apache.kafka.clients.producer.KafkaProducer.doSend(KafkaProducer.java:885)
    ... 4 more
解决办法:

修改server.properties文件

在这两个地方加上容器ip

<think>好的,我需要回答用户关于C++中使用Kafka消费者消费最新消息的问题。首先,我得回想一下Kafka的基本概念和消费者的工作机制。Kafka消费者需要订阅主题,然后从指定的分区拉取消息。用户提到“消费最新消息”,可能指的是从当前时刻开始获取新产生的消息,而不是处理之前的历史消息。 接下来,我需要考虑如何在C++中配置消费者以从最新的偏移量开始消费。Kafka的配置参数中有个auto.offset.reset,这个参数决定了当消费者没有初始偏移量或偏移量失效时的行为。通常可以设置为latest,这样消费者会从最新的消息开始消费。不过,这个默认行为可能因版本或配置而异,所以需要明确设置。 然后,我要想到C++的客户端库,比如librdkafka,它是常用的Kafka客户端库。用户需要正确初始化消费者,配置正确的broker地址,设置消费者组ID,并指定auto.offset.reset为latest。此外,还需要处理消息的拉取和提交偏移量的问题,确保不会重复消费或者丢失消息。 可能还需要提到消费者组的协调机制,如果有多个消费者在同一个组内,分区会被分配,每个消费者负责一部分分区。但用户如果只是单消费者,可能不需要考虑这些。另外,需要注意提交偏移量的方式,自动提交可能会有延迟,手动提交可以更精确控制,但需要处理错误情况。 用户可能遇到的问题包括配置错误导致消费旧数据,或者没有正确处理消息循环导致无法持续获取新消息。需要提醒用户检查配置,正确处理消息循环,以及错误处理机制。 最后,应该给出一个简单的代码示例,展示如何配置消费者,订阅主题,并循环拉取新消息。确保代码中使用正确的配置参数,并解释关键步骤,比如设置auto.offset.reset,订阅主题,poll消息等。 检查是否有遗漏的步骤,比如消费者的正确关闭,资源释放等,但可能不需要在基础示例中详细展开。确保提到的内容结构清晰,步骤明确,帮助用户一步步实现目标。</think>以下分步骤介绍如何在C++中使用Kafka消费者消费最新消息: 1. 环境准备 - 安装librdkafka库:C++通过librdkafka库操作Kafka - 添加头文件:`#include <librdkafka/rdkafkacpp.h>` - 链接库文件:编译时添加`-lrdkafka++`参数 2. 关键配置参数 ```cpp std::string errstr; RdKafka::Conf *conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); // 必须配置项 conf->set("bootstrap.servers", "localhost:9092", errstr); // Broker地址 conf->set("group.id", "test_group", errstr); // 消费者组ID // 关键行为配置 conf->set("auto.offset.reset", "latest", errstr); // 从最新偏移量开始消费 conf->set("enable.auto.commit", "true", errstr); // 自动提交偏移量(默认true) ``` 3. 创建消费者实例 ```cpp RdKafka::KafkaConsumer *consumer = RdKafka::KafkaConsumer::create(conf, errstr); if (!consumer) { std::cerr << "Failed to create consumer: " << errstr << std::endl; delete conf; return; } ``` 4. 订阅主题 ```cpp std::vector<std::string> topics = {"test_topic"}; RdKafka::ErrorCode err = consumer->subscribe(topics); if (err) { std::cerr << "订阅失败: " << RdKafka::err2str(err) << std::endl; delete consumer; return; } ``` 5. 消费消息核心逻辑 ```cpp while (true) { RdKafka::Message *msg = consumer->consume(1000); // 超时1秒 switch (msg->err()) { case RdKafka::ERR__TIMED_OUT: break; // 正常超时,继续轮询 case RdKafka::ERR_NO_ERROR: // 成功获取消息 std::cout << "收到消息: " << static_cast<const char *>(msg->payload()) << std::endl; break; default: std::cerr << "消费错误: " << msg->errstr() << std::endl; break; } delete msg; // 必须释放消息对象 } ``` 关键注意事项: 1. 偏移量控制 - `auto.offset.reset`设置为`latest`时,消费者组首次启动才会生效 - 已提交偏移量后,消费者会从上次提交位置继续消费 - 使用`consumer->seek(...)`可手动调整偏移量 2. 消费者组行为 - 同一消费者组内的消费者会自动平衡分区分配 -消费者加入时触发rebalance,可能导致短暂消费暂停 - 使用`enable.auto.commit=false`可改为手动提交偏移量 3. 性能优化建议 ```cpp conf->set("fetch.wait.max.ms", "100", errstr); // 最大等待时间 conf->set("fetch.message.max.bytes", "1048576", errstr); // 单次最大拉取量 conf->set("queued.min.messages", "1000", errstr); // 最小缓存消息数 ``` 4. 关闭清理 ```cpp consumer->close(); // 停止消费 delete consumer; // 释放内存 RdKafka::wait_destroyed(5000); // 等待资源释放 ``` 完整示例流程: 1. 初始化配置 → 2. 创建消费者 → 3. 订阅主题 → 4. 持续轮询 → 5. 处理消息 → 6. 关闭资源 常见问题排查: - 未收到新消息:检查`auto.offset.reset`是否为`latest` - 重复消费:检查消费者组ID是否唯一,确认自动提交是否生效 - 消费延迟:调整`fetch.wait.max.ms`和`queued.min.messages`参数 进阶功能: - 使用`assign()`指定特定分区消费 - 实现`RebalanceCb`回调处理分区分配变化 - 使用`commitSync()`/`commitAsync()`手动控制偏移量提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值