Kafka的消息自动提交和手动提交

只说结论!

如果我们使用原始apache-kafka 依赖的API来消费数据:

  1. 如果enable.auto.commit为true,则表示自动提交,但不会在拉取数据之后立即提交。在一次poll的数据处理完毕之后,将会在下一次poll数据的时候,首先检查是否到达了auto.commit.interval.ms自动提交间隔的时间,如果到达了(默认5s),那么会提交此前拉取的消息的最大偏移量,否则不会提交。
  2. 如果enable.auto.commit为false,则表示手动提交,那么需要通过consumer.commitAsync()或者commitSync()手动提交偏移量,这两个方法将会提交目前最大的offset,否则重启之后将会消费此前的数据。

如果使用spring-kafka 的@Listener注解来消费数据:

  1. 如果enable.auto.commit为true,则表示自动提交,但不会在拉取数据之后立即提交。在一次poll的数据处理完毕之后,将会在下一次poll数据的时候,首先检查是否到达了auto.commit.interval.ms自动提交间隔的时间,如果到达了(默认5s),那么会提交此前拉去的消息的最大偏移量,否则不会提交。

  2. 如果enable.auto.commit为false,则表示手动提交此时需要注意选择提交的模式AckMode。

    1. BATCH:默认的提交模式。当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后提交,由Spring帮我们提交。
    2. RECORD:当每一条记录被消费者监听器(ListenerConsumer)处理之后提交,由Spring帮我们提交。
    3. TIME:当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后,距离上次提交时间大于TIME时提交,由Spring帮我们提交。
    4. COUNT:当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后,被处理record数量大于等于COUNT时提交,由Spring帮我们提交。
    5. COUNT_TIME:TIME和COUNT有一个条件满足时提交,由Spring帮我们提交。
    6. MANUAL:需要对监听消息的方法中引入 Acknowledgment参数,并在代码中调用acknowledge()方法进行手动提交。实际上,对于每一批poll()的数据,每次调用acknowledge()方法之后仅仅是将offset存放到本地map缓存,在下一次poll的时候,在poll新数据之前从缓存中拿出来批量提交,也就是说与BATCH有相同的语义。
    7. MANUAL_IMMEDIATE:需要对监听消息的方法中引入 Acknowledgment参数,并在代码中调用acknowledge()方法进行手动提交。实际上,对于每一批poll()的数据,每次调用acknowledge()方法之后立即进行偏移量的提交。

由于默认的提交模式是BATCH,因此在使用@Listener注解来消费数据时,即使enable.auto.commit为false,偏移量也会在每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后提交,这里的提交实际上是手动提交,但是这个“手动提交”操作由Spring帮我们做了,因此如果不设置AckMode为MANUAL或者MANUAL_IMMEDIATE,我们仍然会觉得这些数据被“自动提交”了,实际上是由Spring帮我们执行了手动提交的代码,造成误解。

MANUAL和MANUAL_IMMEDIATE的区别是:MANUAL_IMMEDIATE是消费完一个消息就提交,MANUAL是处理完一批消息(默认500)之后,在下一次拉取消息之前批量提交。

如果中间有一批数据没有提交,那么在一次消费过程中,这些没有提交的数据不会重复消费,而是会一直向后消费,除非重启消费者,会被再次消费。如果后面有消息的offset被提交,那么该offset之前的所有消息都算作已提交,重启之后也不会被再次消费。

相关文章:

Kafka

如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!

  • 15
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Kafka 是一个分布式的流平台,多个消费者可以同时订阅一个主题,并且每个消费者可以独立地读取主题中的消息。在 Kafka 中,消费者可以选择自动提交偏移量(offset),也可以选择手动提交偏移量。 手动提交偏移量意味着消费者负责跟踪已经处理的消息的偏移量,并且在适当的时候手动提交Kafka 集群。手动提交偏移量可以带来更好的控制,消费者可以根据业务需求决定何时提交、如何提交以及提交的频率。 在 Kafka 中,有两种手动提交的方式:同步提交和异步提交。 同步提交是指消费者在处理完一批消息后,等待提交请求完成后再继续下一批消息的处理。这种方式虽然保证了提交的可靠性,但会导致额外的等待时间,降低了消费者的吞吐量。 异步提交是指消费者在处理完一批消息后,立即发起提交请求,但并不等待请求完成就继续处理下一批消息。这种方式能够提高消费者的吞吐量,但在网络或服务故障时可能会导致提交失败,需要进行异常处理。 为了保证消费者在发生故障时不会丢失已经处理的消息和已经提交的偏移量,可以通过设置消费者的 auto.commit.offset 参数,将偏移量保存在 Kafka 服务端。这样,在消费者重新启动时,可以从上次提交的偏移量开始继续消费消息。 总的来说,手动提交偏移量可以提供更好的控制和可靠性,但需要消费者自己管理偏移量和处理提交请求的逻辑。消费者需要根据自身的需求选择适合的提交方式,并进行适当的异常处理,以保证消息的完整性和正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值