Kafka 核心技术与实战
胡夕
Apache Kafka Committer,老虎证券技术总监
52815 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
结束语 (1讲)
Kafka 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

18 | Kafka中位移提交那些事儿

提供回调函数
不会阻塞
异步操作
会一直等待,直到位移被成功提交才会返回
同步操作
commitSync和commitAsync
commitAsync()
commitSync()
commitAsync()
commitSync()
用户自己提交位移
auto.commit.interval.ms
enable.auto.commit
Kafka Consumer在后台默默地为你提交位移
直接影响Consumer所能提供的消息语义保障
Kafka“无脑”地接受提交的位移
由用户负责维护
避免整个消费过程重来一遍
表征Consumer的消费进度
在分区粒度上进行
Consumer需要向Kafka汇报自己的位移数据
记录了Consumer要消费的下一条消息的位移
commitAsync(Map<TopicPartition, OffsetAndMetadata>)
commitSync(Map<TopicPartition, OffsetAndMetadata>)
组合使用
异步提交
同步提交
手动提交
自动提交
提交位移的管理
语义保障
目的
提交位移
Consumer的消费位移
更精细化的位移管理
提交位移的方法
位移提交
Kafka提供了哪些提交位移的方法?

该思维导图由 AI 生成,仅供参考

你好,我是胡夕。今天我们来聊聊 Kafka 中位移提交的那些事儿。
之前我们说过,Consumer 端有个位移的概念,它和消息在分区中的位移不是一回事儿,虽然它们的英文都是 Offset。今天我们要聊的位移是 Consumer 的消费位移,它记录了 Consumer 要消费的下一条消息的位移。这可能和你以前了解的有些出入,不过切记是下一条消息的位移,而不是目前最新消费消息的位移。
我来举个例子说明一下。假设一个分区中有 10 条消息,位移分别是 0 到 9。某个 Consumer 应用已消费了 5 条消息,这就说明该 Consumer 消费了位移为 0 到 4 的 5 条消息,此时 Consumer 的位移是 5,指向了下一条消息的位移。
Consumer 需要向 Kafka 汇报自己的位移数据,这个汇报过程被称为提交位移(Committing Offsets)。因为 Consumer 能够同时消费多个分区的数据,所以位移的提交实际上是在分区粒度上进行的,Consumer 需要为分配给它的每个分区提交各自的位移数据
提交位移主要是为了表征 Consumer 的消费进度,这样当 Consumer 发生故障重启之后,就能够从 Kafka 中读取之前提交的位移值,然后从相应的位移处继续消费,从而避免整个消费过程重来一遍。换句话说,位移提交是 Kafka 提供给你的一个工具或语义保障,你负责维持这个语义保障,即如果你提交了位移 X,那么 Kafka 会认为所有位移值小于 X 的消息你都已经成功消费了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kafka Consumer位移提交是确保消费端语义保障的重要手段。本文介绍了Kafka提供的多种提交位移的方法,包括自动提交和手动提交,以及同步提交和异步提交。手动提交位移更加可控和灵活,结合使用commitSync()和commitAsync()两种方法可以实现异步无阻塞式的位移管理,并确保位移的正确性。此外,建议读者结合使用这些方法来实现手动的位移提交,以提高位移管理的精细度和效率。总之,Kafka Consumer API提供了多种灵活的提交方法,方便读者根据自身业务场景定制提交策略。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kafka 核心技术与实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(128)

  • 最新
  • 精选
  • 水天一色
    消费者提了异步 commit 实际还没更新完offset,消费者再不断地poll,其实会有重复消费的情况吧?

    作者回复: 只要consumer没有重启,不会发生重复消费。因为在运行过程中consumer会记录已获取的消息位移

    2019-12-07
    15
    54
  • Roy Liang
    要彻底避免消息重复消费,这样是否可行?在consumer端进行幂等操作。这样kafka就可以设置自动提交位移了

    作者回复: 一直以来,在业务端实现去重或幂等都是避免消费的不二法则。单纯依赖Kafka避免重复消费很难做到~

    2020-04-16
    4
    43
  • ban
    老师,你好。有个场景不太明白。我做个假设,比如说我的模式是自动提交,自动提交间隔是20秒一次,那我消费了10个消息,很快一秒内就结束。但是这时候我自动提交时间还没到(那是不是意味着不会提交offer),然后这时候我又去poll获取消息,会不会导致一直获取上一批的消息? 还是说如果consumer消费完了,自动提交时间还没到,如果你去poll,这时候会自动提交,就不会出现重复消费的情况。

    作者回复: 不会的。consumer内部维护了一个指针,能够探测到下一条要消费的数据

    2019-07-13
    7
    20
  • july
    老师你好,这里是否可以理解为 自动提交逻辑是在poll方法中,如果间隔大于最小提交间隔,就会运行逻辑进行offset提交,如果小于最小间隔,则忽略offset提交逻辑?也就是说上次poll 的数据即便处理结束,没有调用下一次poll,那么offset也不会提交?

    作者回复: 基本上是这样。

    2020-04-15
    4
    19
  • 无菇朋友
    老师您好,有一个疑问,为什么poll之前的提交和按频率自动提交是一个时机,假如频率是5s提交一次,某两次poll之间的间隔是6s,这时候是怎么处理提交的?忘老师解答下,着实没想通这个地方

    作者回复: 嗯, 严格来说。提交频率指的是最小的提交间隔。比如设置5s,Kafka保证至少等待5s才会自动提交一次。

    2019-07-21
    6
    17
  • lmtoo
    对于手动同步和异步提交结合的场景,如果poll出来的消息是500条,而业务处理200条的时候,业务抛异常了,后续消息根本就没有被遍历过,finally里手动同步提交的是201还是000,还是501?

    作者回复: 如果调用没有参数的commit,那么提交的是500

    2019-07-13
    11
    12
  • 我已经设置了昵称
    auto.commit.interval.ms为5秒,且为自动提交 如果业务5秒内还没处理完,这个客户端怎么处理offset

    作者回复: 这个参数其实有点误导。它其实的意思是至少5秒。可能多于5秒

    2020-05-20
    11
  • Algoric
    自动提交一定不会消息丢失吗,如果每次poll的数据过多,在提交时间内没有处理完,这时达到提交时间,那么Kafka还是重复提交上次poll的最大位移吗,还是讲本次poll的消息最大位移提交?

    作者回复: hmmm... 其实我一直觉得提交间隔这个参数的命名有些问题。它实际保证的是位移至少要隔一段时间才会提交,如果你是单线程处理消息,那么只有处理完消息后才会提交位移,可能远比你设置的间隔长。

    2019-09-25
    8
    7
  • Liam
    所以自动提交有2个时机吗? 1 固定频率提及,例如5s提及一次 2 poll新数据之前提交前面消费的数据

    作者回复: 它们实际上是一个时机

    2019-07-15
    4
    6
  • bbbi
    老师您好!有一个问题时。Kafka的offset是一个数字,那么这个数值最大时多少?有没有可能存在用完的情况?

    作者回复: offset是long型的,几乎不可能用完。

    2020-02-14
    5
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部