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介绍的主要内容,如果未能解决你的问题,请参考以下文章
kafka:spring集成 kafka(springboot集成客户端集成)