【面试必备】一文讲清 Kafka 里的 Consumer Group 和 Offset 机制! ...

打印 上一主题 下一主题

主题 1970|帖子 1970|积分 5910

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
不同的 Consumer Group 在消费同一个 Topic 时,它们的 offset 是彼此独立的,每个 Consumer Group 都会维护自己的一套 offset。如许 Kafka 允许多个业务系统独立消费相同的数据,而不会相互影响。

1. Consumer Group 和 Offset 关系



  • Kafka 以“Consumer Group”为单位来维护 offset,不同的 Consumer Group 可以消费同一个 Topic,但它们的消费进度(offset)是相互独立的。
  • 每个 Consumer Group 里的每个 Consumer 只会消费某些 Partition,不会和同组的其他 Consumer 冲突。
举个例子:


  • 设想 Topic = orders,包罗 3 个 Partition,有两个业务分别消费:

    • Group A(用户行为分析系统)
    • Group B(风控系统)

PartitionOffset(Group A)Offset(Group B)orders-0100250orders-1500600orders-2300400   表明:Group A 和 Group B 各自独立维护自己的 offset,Group A 可能比 Group B 早大概晚消费同一 Partition 的数据,但它们互不影响。
  
2. Kafka 把 Offset 存在哪里?

Kafka 默认把 offset 存储在一个内部 Topic:__consumer_offsets,这个 Topic 由 Kafka 内部管理,不会被平常业务消费。
Kafka 维护 Offset 的方式

Kafka 接纳 “Partition + Consumer Group” 作为 key 来存储 Offset:


  • Key: {Topic, Partition, Consumer Group}
  • Value: 当前消费的 Offset 值
示例
Kafka __consumer_offsets 里可能存储类似如许的数据:
  1. {
  2.   "topic": "orders",
  3.   "partition": 1,
  4.   "consumer_group": "Group_A",
  5.   "offset": 500
  6. }
复制代码
表示 Group_A 在 orders-1 分区消费到了 offset = 500
3. Offset 提交(Commit Offset)

Kafka 提供两种方式提交 Offset:

  • 主动提交 (enable.auto.commit=true)

    • 默认每 auto.commit.interval.ms=5000 毫秒主动提交 offset。
    • 但如果 Consumer 在这 5 秒内崩溃或重启,可能会重复消费部分数据。

  • 手动提交 (enable.auto.commit=false)

    • 需要调用 commitSync() 或 commitAsync() 来提交 offset。
    • commitSync(): 确保 offset 乐成提交,可能会导致短暂壅闭。
    • commitAsync(): 异步提交,不影响消费速度,但可能丢失部分提交。


4. 既然 Offset 在 Kafka 里存着,Consumer 重启后会从哪里开始消费?

Kafka 提供了一个参数 auto.offset.reset 来决定 Consumer 启动时的行为:


  • latest(默认)→ 从最新消息开始消费(如果找不到之前的 offset)
  • earliest → 从最早的消息开始消费
  • none → 如果没有 offset 记载,则抛出异常
示例
如果 Group_A 的某个 Consumer 崩溃并重启:


  • 如果之前提交了 offset,就从提交的位置继续消费。
  • 如果 offset 记载丢失,且 auto.offset.reset=earliest,就会重新消费所有未删除的消息。
  • 如果 auto.offset.reset=latest,就直接从新生产的消息开始消费,不会读旧数据。

5. 还有其他存储 Offset 的方式吗?

是的,Kafka 也支持自定义 Offset 存储方式,比如:


  • 存数据库(MySQL/PostgreSQL):应用程序自己管理 offset,适用于严酷消费控制的场景。
  • 存 Zookeeper(老方法):Kafka 0.9 以前 offset 存在 Zookeeper,但后续改为 __consumer_offsets 这个 Topic,更高效。

6. 总结

问题答案不同 Consumer Group 共享 Offset 吗?不是,每个 Consumer Group 维护自己的 offsetKafka 默认在哪里存 offset?__consumer_offsets 这个内部 Topicoffset 何时提交?可以主动提交(默认),也可以手动提交Consumer 重启后从哪里消费?取决于 auto.offset.reset 设置可以不用 Kafka 存 Offset 吗?可以,应用可以把 offset 存在数据库等地方 如许一来,Kafka 里的 Consumer Group 和 Offset 机制 是不是更清楚了?

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表