Offset 是 Kafka 中用来标识消息位置的指针。每个分区都有一个未提交的 Offset(Next Offset)和多个已提交的 Offset(Committed Offset)。
它的主要作用是:
- 标识消费者在对应分区的消费位置,未提交的 Offset 指向下一次将要消费的消息位置。
- 记录消费者消费消息的进度,根据已提交的 Offset 可以查询到消费者消费过的消息。
- 当消费者失败或重新启动时,根据已提交的 Offset 可以继续消费未消费的消息。
- 根据消费组的已提交 Offset 可以查询整个组的消费进度。
Offset 的主要工作机制是:
- 生产者发送消息到分区时,会自动为消息分配一个唯一的 Offset。
- 消费者初始化时会获取各分区的最新 Offset,其值指向下一次将要消费的消息位置。
- 消费者消费消息后会自动将未提交的 Offset 更新为最新值,用来标识下一次消费的位置。
- 消费者需要手动提交 Offset,通常会定期提交或在消费完一批消息后提交。
- 如果消费者故障或重新开始,将从最新的已提交 Offset 开始重新消费消息。
- 消费组的未提交 Offset 是组内各消费者未提交 Offset 的最大值。组的已提交 Offset 是组内所有消费者已提交 Offset 的最小值。
- 根据Topic 的日志文件可以查询任意一个Offset 对应的消息。
理解 Kafka 中 Offset 的作用机制,有助于我们合理管理消费者的 Offset,确保消息的Exactly-Once 消费语义。