作为一个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的消费模式,最好不要在运行热新增分区或主题,否则客户端处理起来比较麻烦。如果必要