消息队列偏移量
Offset 是什么?
消息在分区里的唯一序号,消费者靠它记住读到哪
类比:书签,夹在第 1024 页,下次从这继续读
它是什么
每条消息在分区内都有一个单调递增的编号,从 0 开始。它标识的是「位置」,不是「第几条业务消息」。
消费者提交的 offset 表示「这个位置之前的消息我都处理完了」。重启后从提交的位置继续消费。
提交方式决定会不会重复
自动提交简单但可能丢消息:拉取后还没处理完就到时间提交了,进程挂了这批消息就丢了。
手动提交更可控:处理完业务逻辑再提交,代价是提交前崩溃会重复消费,所以消费逻辑要幂等。
- 至少一次(at least once):先处理后提交,可能重复
- 至多一次(at most once):先提交后处理,可能丢失
- 精确一次(exactly once):需要事务或幂等 + 去重表
和 RocketMQ 的差别
RocketMQ 的 offset 存在 Broker 端(集群模式)或客户端(广播模式),Kafka 存在 __consumer_offsets 这个内部 Topic 里。概念一致,存储位置不同。