SpringBoot集成kafka之AckMode介绍

Posted 敲代码的小小酥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot集成kafka之AckMode介绍相关的知识,希望对你有一定的参考价值。

一、AckMode介绍

kafka消费端在读取数据后,会向kafka服务端提交偏移量,来记录消费端读取数据的位置。提交偏移量分为手动提交和自动提交,为了保证数据读取的安全性,我们一般设置成手动提交偏移量。在SpringBoot集成kafka后,SpringBoot为我们提供了AckMode枚举,供我们选择。AckMode有以下几种模式:(AckMode在ContainerProperties类的内部定义)

 public static enum AckMode {
        RECORD,
        BATCH,
        TIME,
        COUNT,
        COUNT_TIME,
        MANUAL,
        MANUAL_IMMEDIATE;

        private AckMode() {
        }
    }

自动提交设置:

  • RECORD:每处理一条commit一次
  • BATCH(默认):每次poll的时候批量提交一次,频率取决于每次poll的调用频率
  • TIME :达到一定时间间隔后,自动提交, 并不是一到就立马提交,如果此时正在消费某一条消息,需要等这条消息被消费完成,才能提交消费进度
  • COUNT:消费成功的消息数到达一定数量后,自动提交 ,它并不是一到就立马提交,如果此时正在消费某一条消息,需要等这条消息被消费完成,才能提交消费进度
  • COUNT_TIME: TIME 和 COUNT 的结合体,满足任一都会自动提交。

手工提交设置

  • MANUAL:当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后,
    手动调用Acknowledgment.acknowledge()后提交
  • MANUAL_IMMEDIATE:手动调用Acknowledgment.acknowledge()后立即提交

由此可知,在设置为手动提交时,我们需要设置MANUAL或MANUAL_IMMEDIATE。

二、MANUAL与MANUAL_IMMEDIATE的区别

通过上面的描述可以知道,MANUAL是批量处理完多条数据后,提交一次偏移量。而MANUAL_IMMEDIATE是随时调用acknowledge()方法,随时提交偏移量,它可以实现每条数据提交一次偏移量。
从字面意思上来看,我们可以看出,MANUAL的效率要比MANUAL_IMMEDIATE高。下面,我们通过数据,来体验一下效果。
首先,我们先通过生产者往Topic为demos的主题下存放10W条数据。此处代码忽略,可用多线程创建多个生产者发送数据。
然后,demos主题里已经有10W条数据了,我们创建一个名为demo的消费者群组,来消费demos主题下的这10W条数据,看多长时间可以消费完。
(demos主题分成了64个分区,消费者也用64个消费者去消费。kafka集群有3个broker,但是3个broker都在同一台服务器上。)

下面,我们先测试MANUAL_IMMEDIATE模式下的消费时间,消费者Listener的代码如下:

public class ConsumerListener {
    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
    @KafkaListener(topics = {"demos"})
    public void listen(ConsumerRecord<?, ?> record, Acknowledgment ack) {
        System.err.println("处理模块!!!");
       /* System.out.println("消费者监听");
        System.out.println("线程信息:"+Thread.currentThread().getName());
        logger.info("收到消息的key: " + record.key());
        logger.info("收到消息的value: " + record.value().toString());*/
        ack.acknowledge();

    }

}

启动项目,查看输出日志,大概需要15秒,能把10W调数据消费完。而采用MANUAL模式,4~5秒就能处理完成。
由此可以知道,使用MANUAL方式进行批量提交,效率要比MANUAL_IMMEDIATE高出很多。

以上是关于SpringBoot集成kafka之AckMode介绍的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot集成Kafka

kafka:spring集成 kafka(springboot集成客户端集成)

大数据-kafka学习——集成SpringBoot

SpringBoot 集成 Kafka

springboot kafka集成(实现producer和consumer)

springboot 集成kafka