只说结论!

如果我们使用原始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学习博客!

Kafka的消息自动提交和手动提交相关推荐

  1. Kafka消费消息自动提交与手动提交

    消费者poll消息得过程(poll的意思是从broker拿消息,并不代表拿到就消费成功了) 消费者建立了与broker之间的⻓连接,开始poll消息. 默认一次poll 500条消息 props.pu ...

  2. jdbc的事务自动提交和手动提交,以及mybatis开启自动提交后是否会复用一个连接的验证

    jdbc的sql执行默认是自动提交事务 默认时自动提交,当我手动提交时会报错,不过数据还是会插入到数据库中,因为执行完executeupdate后数据库会自动commit 开启手动提交 手动提交则需要 ...

  3. kafka-offset手动提交和自动提交

    目录 首先回顾之前的知识点 自动提交offset 手动提交 消费者poll消息的细节 完整代码: 按照新方法进行消费消息 1.指定时间进行消息的消费 2.指定分区开始从头消费+指定分区的偏移量开始消费 ...

  4. python kafka offset自动提交_Spring-Kafka —— 实现批量消费和手动提交offset

    spring-kafka的官方文档介绍,可以知道自1.1版本之后, @KafkaListener开始支持批量消费,只需要设置batchListener参数为true 把application.yml中 ...

  5. 关于Kafka 的 consumer 消费者手动提交详解

    前言 在上一篇 Kafka使用Java实现数据的生产和消费demo 中介绍如何简单的使用kafka进行数据传输.本篇则重点介绍kafka中的 consumer 消费者的讲解. 应用场景 在上一篇kaf ...

  6. kafka 同步提交 异步_腾讯游戏工程师分享:简单理解 Kafka 的消息可靠性策略

    作者:hymanzhang,腾讯 IEG 运营开发工程师 背景 部门的开发同学最近在开发一个活动的过程中,需要关注大量的应用后台逻辑,捕捉各种事件的触发.在设计时打算采用 kafka 消息队列进行业务 ...

  7. Kafka手动提交偏移量的作用到底是什么???

    手动提交偏移量的原因 最近拜读了很多文章,都谈到为了保证消息的安全消费(避免消息丢失和消息重复读取),建议消费者客户端手动提交偏移量.具体如下: 1.当设置为自动提交时,当kafka消费者读取到消息后 ...

  8. Kafka:Consumer手动提交offset

    在上一篇博客中介绍了使用Consumer订阅多个Topic或者多个Partition: Kafka:Consumer订阅 在上一篇博客的测试样例中,Consumer都是自动提交offset,这是通过下 ...

  9. rabbitmq 手动提交_RabbitMQ系列(四)RabbitMQ事务和Confirm发送方消息确认——深入解读 - 王磊的博客 - 博客园...

    RabbitMQ事务和Confirm发送方消息确认--深入解读 RabbitMQ系列文章 引言 根据前面的知识( 深入了解RabbitMQ工作原理及简单使用 . Rabbit的几种工作模式介绍与实践 ...

最新文章

  1. android 8.0 l2tp问题,【Win】使用L2TP出現809錯誤
  2. 并发编程-02并发基础CPU多级缓存和Java内存模型JMM
  3. PMCAFF微课堂|猎豹清理大师亿万用户量产品背后的紫牛方法论,傅盛不会说的秘密...
  4. 【分布式】1、CAP原则(CAP定理)、BASE理论
  5. our reuse project in HCP
  6. C++设计模式之工厂模式(1)
  7. TC的文件拷贝/移动
  8. Npoi导出excel整理(附源码)
  9. kafka常见疑难问题
  10. numpy二维数组改变某些数_机器学习:Python常用库——Numpy库
  11. 字节流和字符流学习笔记:
  12. redis cluster以及master-slave在windows下环境搭建
  13. 随机森林(Random Forest)通俗教程
  14. sms实现wap push的方法和格式
  15. 典型平面阵列分布的3D方向图
  16. Selenium批量下载抖音无水印高清视频
  17. chrome浏览器打开网页,总是跳转到2345主页的解决方法 2345.com 绑架主页
  18. 基于S变换的电压暂降检测研究及仿真设计
  19. 1068 Find More Coins (30分)
  20. 简述使用混合传递参数时的基本原则_过程控制系统与仪表习题答案 -

热门文章

  1. LOL九周年战斗之夜 钻石宝箱获取攻略
  2. C#游戏开发之炸弹人游戏开发
  3. 个人电脑创建mysql数据库
  4. php支付宝提现demo,php 支付宝 支付Demo模板
  5. 梅科尔工作室-李舒婷-鸿蒙作业3
  6. 飞行对小鸟来说压力很大吗?
  7. 英文歌曲初恋《heartbeats》 心跳
  8. 不收版面有稿费的100家杂志期刊
  9. 极客mysql45讲学习总结
  10. 无法加载静态的图片Failed to load resource: the server responded with a status of 404 (Not Found)