kakfa用offset来记录某消费者消费到的位置,由于kafka是个分布式结构,数据被存放在多个partition上,那么要为每个partition单独记录一个offset,该offset保存在一个叫__consumer_offsets 的Topic里,与此同时,kafka规定在同一消费者组里,同一时刻一个partition只能有一个消费者,这样的规定优势是每个consumer不用都跟大量的broker通信,减少通信开销,同时也降低了分配难度,实现也更简单,另外,因为同一个partition里的数据是有序的,这种设计可以保证每个partition里的数据是有序被消费。

那么,在一个partition用一个offset记录的设计下,假设有三个有序的消息(m1,m2,m3),消费者顺序消费,若是m1、m2消费了但是不提交offset,消费m3的时候提交offset,那么此时kafka记录的offset是m1的位置(第一次未commit的位置)还是m3的位置(最新commit的位置)呢

经过实验(实验版本kakfa 0.10.0, Spring kafka api),kafka记录的是最新commit的位置作为offset,那么未提交的消息m1、m2也被kafka认为是已经消费过了的,不会再重复消费:

设想这样一个常见的场景,若程序消费消息后处理并存库,若存库失败则不commit offset,即用at least once设置,期望存库失败的消息能被再次消费,那么问题就来了,若是消费者消费下一条消息成功并commit了offset,那么存库失败的消息显然不能被重新消费了,它的offset已经被覆盖,kafka已经认为它被消费了,这样就达不到预期的效果了,实验后结果也确实如此

难道消费者有一个消息没有commit的话会一直重试去消费这个消息吗,那岂不是很容易死锁,经实验,在不触发rebalance的情况下,消费者并不会去重新消费之前没有commit的消息,而是继续往下消费,那么没有commit的消息妥妥的就丢了

再考虑触发rebalance的情况,如下图,任意broker或者是消费者的变化(重启、移除、加入新节点)的情况都会触发,也就是说,在一个partition 上,一个消息没有被commit,在对应的消费者还没有commit后续的消息之前,若是触发了rebalance,这种情况下,新分配给这个partition的消费者会重新消费这条消息。

经实验,将消费者重启即可重新消费,此外,实验过程中发现,一旦一个消息未被消费者commit,且一段时间内(很短)没有后续消息的话,会触发rebalance,于此对照的是:正常消费并commit的消费者,尽管后续没有消息来,依然不会触发rebalance。

对于以上这种情况,我认为消费者端会存放一个值用来记录消费到了哪里,这个值可能与partition上的offset不一致(消息未提交),于是每隔一段时间消费者与broker同步时,若发现这两个值不一致,就会触发rebalance,这一段就属于猜想了,没有找到文档,下一步再仔细看吧。

分析这么多,得出一个结论。单纯想通过不commit offset来想达到再次消费消息的目的是不太靠谱的,考虑额外的措施,如:一旦消费消息后存库失败,那么就不commit offset,并将该消费者重启以触发rebalance,这样的弊端是会一直重复消费这个消息,容易死锁;要么就把处理失败的消息再投递,丢回kafka里;要么就打个log,然后commit 得了。

kafka comsumer消费消息后不commit offset的情况分析相关推荐

  1. 利用Kafka发送/消费消息-Java示例

    利用Kafka发送/消费消息-Java示例 当使用命令行工具把基本的组件运行起来后,再使用Java client就很简单,这里是入门的第一个Java客户端程序,有很多需要深入理解的地方. 依赖配置 & ...

  2. kafka如何消费消息

    转载自:http://generalcode.cn/archives/255 消费者与消费组 假设这么个场景:我们从Kafka中读取消息,并且进行检查,最后产生结果数据.我们可以创建一个消费者实例去做 ...

  3. 【Kafka笔记】5.Kafka 多线程消费消息

    Kafka多线程消费理解 Kafka Java Consumer设计 Kafka Java Consumer采用的是单线程的设计.其入口类KafkaConsumer是一个双线程的设计,即用户主线程和心 ...

  4. Kafka 批量消费消息

    改成批量消费消息有两个需要注意的地方: 1.配置文件修改 # 批量消费每次最多消费条目数 max-poll-records: 20 listener:# 关闭监听topic不存在的话项目启动报错mis ...

  5. java利用kafka生产消费消息

    2019独角兽企业重金招聘Python工程师标准>>> 1.producer程序 package com.test.frame.kafka.controller;import kaf ...

  6. java kafka 消费_java利用kafka生产消费消息

    1.producer程序 package com.test.frame.kafka.controller; import kafka.javaapi.producer.Producer; import ...

  7. kafka 主动消费_Kafka核心API——Consumer消费者

    Consumer之自动提交 在上文中介绍了Producer API的使用,现在我们已经知道如何将消息通过API发送到Kafka中了,那么现在的生产者/消费者模型就还差一位扮演消费者的角色了.因此,本文 ...

  8. Go语言如何操纵Kafka才能保证消息不丢?

    背景 目前一些互联网公司会使用消息队列来做核心业务,因为是核心业务,所以对数据的最后一致性比较敏感,如果中间出现数据丢失,就会引来用户的投诉,年底绩效就变成325了.之前和几个朋友聊天,他们的公司都在 ...

  9. kafka 重复消费场景及解决方案

    1.与消费者有关的重要参数 在讨论重复消费之前,首先介绍一下kafka中几个跟消费有关的配置参数. enable.auto.commit 默认值true,表示消费者会周期性自动提交消费的offset ...

最新文章

  1. python窗口程序-窗口程序python
  2. 【转】C++一次读取整个文件
  3. Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果(1)
  4. Zencart的首页php 301,Zencart 做了301重定向后不能登陆网站后台的解决方案
  5. si24r1程序_简要分析SI24R1替代兼容NRF24L01P
  6. CSS自学笔记(16):CSS3 用户界面
  7. 机器学习面试题(part4)
  8. Visual Studio 即时窗口实用技巧
  9. 求职,北京,.netGIS
  10. deepin安装zsh以及简单配置
  11. 第十一篇 浅拷贝和深拷贝
  12. 近来很多人通过这个博文加关注,为何?
  13. PD--SqlServer生成Hive建表语句
  14. matlab中如何去掉多行注释_MATLAB中多行注释的三种方法
  15. 24位RGB颜色与16位RGB颜色的转换
  16. raid 0 1 5 10的区别以及应用
  17. 古方怡雪祛斑效果怎么样,实话实说!
  18. mvn skip test
  19. 私募量化策略超额收益来源分析
  20. vue 拖拽小图标获取坐标位置

热门文章

  1. 【JavaScript】DOM 操作元素样式和元素类名
  2. U盘内存卡数据丢失怎么恢复,这样操作也可以
  3. 视频教程-Java异常原理剖析-Java
  4. Vue FSC在线编译代码实时预览@vue/repl
  5. 黑马程序员各学科超长体验课知识点汇总
  6. js 预编译 AO对象跟GO对象
  7. 内燃机 vs 外燃机
  8. 解决 Windows USB 鼠标键盘断连掉线的问题 和 安全删除硬件并弹出媒体图标 没有弹出移动硬盘的选项
  9. 天宝数字水准仪数据格式转换
  10. 创造一个计算机语言,世界上第一个文言文编程语言诞生,创造它的是一个大学生...