中间件速查手册
消息队列偏移量

Offset 是什么?

消息在分区里的唯一序号,消费者靠它记住读到哪

类比:书签,夹在第 1024 页,下次从这继续读

它是什么

每条消息在分区内都有一个单调递增的编号,从 0 开始。它标识的是「位置」,不是「第几条业务消息」。

消费者提交的 offset 表示「这个位置之前的消息我都处理完了」。重启后从提交的位置继续消费。

提交方式决定会不会重复

自动提交简单但可能丢消息:拉取后还没处理完就到时间提交了,进程挂了这批消息就丢了。

手动提交更可控:处理完业务逻辑再提交,代价是提交前崩溃会重复消费,所以消费逻辑要幂等。

  • 至少一次(at least once):先处理后提交,可能重复
  • 至多一次(at most once):先提交后处理,可能丢失
  • 精确一次(exactly once):需要事务或幂等 + 去重表

和 RocketMQ 的差别

RocketMQ 的 offset 存在 Broker 端(集群模式)或客户端(广播模式),Kafka 存在 __consumer_offsets 这个内部 Topic 里。概念一致,存储位置不同。

它出现在这些中间件里

相关概念