Kafka 如何实现更高效消费者-批量读取(C++客户端实现)

本文探讨了C++程序中使用librdkafka C++接口的优点,以及选择C接口的原因——为了更好地处理ABI兼容性。详细介绍了三种消费模式(逐条读取、批量读取和队列消费),并提供了代码示例,包括配置、消息处理和注意事项。

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

作为一个c++程序,我相信很多人都会使用c++的librdkafkacpp的接口,这些接口通过C++封装,使用起来方便,不需要去了解底层的c接口的封装及实现,是最理想的使用方式。

那为啥还要使用C接口呢?

这就涉及到C++的ABI二进制兼容问题。

当我们编译一个C++动态库,受限于不同的编译器版本,无论是gcc还是VC,都存在着兼容问题。对于一个生产版本,如果在统一了编译工具链的情景下,是可以使用C++版本,但如果考虑到更好的ABI兼容,所以就选择了C库。其无论在VC还是gcc,都表现得很好。

C库kafka的消费模式

 三种消费模式的异同

librdKafka 提供了三种不同的消费模式,下面将讲解这三种模式的差异及如何使用。

// 一次读取一条数据
rd_kafka_consumer_poll();
rd_kafka_consume();

// 批量读取,一次可以读取多条数据
// 通过回调函数的批量读取,将废弃
rd_kafka_consume_callback();
rd_kafka_consume_batch();

// 通过Queue路由道特定的处理函数
rd_kafka_consume_callback_queue
rd_kafka_consume_batch_queue

1、这种模式,直接使用rd_kafka_consumer_poll()接口,其可以实现1次读取一条,这种场景对于数据量不大,可以很好的使用,而且其客户端API也实现了相关的消息确认和提交,大多数采用这种方式,这种方式的例程,我在前面的博文中有讲到,有兴趣的可以去看看

2、这种模式是批量读取的模式,这种模式下有两种接口,一种基于api的回调

rd_kafka_consume_callback,这个接口根据官方文档是即将被废弃的接口,所以不建议使用该接口,建议使用rd_kafka_consume_batch(),后面会给出这种模式下的使用例子。

3、使用Queue的方式,该方式也提供了两种模式,一种回调,一种直接消费,回调的方式应该在性能上是最高的。这种方式与第二种方式的不同是,他能让不同topic,不同patition的数据路由到一个队列,也就是对于一个需要处理多种数据的消费者。

使用批量读取的注意:

1、消息最好程序中自己做确认提交,这样在kafka的服务,才不会看到滞后的消息消费

2、注意消息的销毁,kafka在销毁对象时会持有引用技术,消费完的消息,要destoy

3、对于topic+partition的消费模式,最好不要在运行热新增分区或主题,否则客户端处理起来比较麻烦。如果必要

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值