马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
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 里可能存储类似如许的数据:
- {
- "topic": "orders",
- "partition": 1,
- "consumer_group": "Group_A",
- "offset": 500
- }
复制代码 表示 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企服之家,中国第一个企服评测及商务社交产业平台。 |