在Kafka 0.8.2 或以后版本中,支持将offset提交给broker,由broker管理偏移量。在librdkafka中也支持配置偏移量存储方式:’file’ - 本地文件存储 (offset.store.path, et.al), ‘broker’ - 在 broker 上提交存储。
但是在实际应用场景中,往往会遇到这样一种情景:消费者消费了消息,然后进行处理,当处理失败或者消费者异常退出时,希望还能够重试失败的消息。因此需要先消费-处理,成功后再进行偏移量的提交。尤其是在批量抓取这种场景下,如果一批数据的偏移量已经提交了,之后才发现处理失败,就会导致丢失大部分数据。
于是在研究了很久librdkafka后,写出的可延迟回写offset的消费者实例:
hpp文件kafkaConsumer.hpp:
#ifndef KAFKA_CONSUMER_HPP
#define KAFKA_CONSUMER_HPP
#include <string>
#include "rdkafka/src-cpp/rdkafkacpp.h"
class Kafka_Consumer
{
public:
Kafka_Consumer(std::string groupid, std::string broker_list, std::vector<std::string> topics)
{
std::string errstr;
kafka_conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL);
kafka_tconf = RdKafka::Conf::create(RdKafka::Conf::CONF_TOPIC);
if (kafka_conf-&g