Kafka中endOffset大于最后一条可消费消息offset+1的原因是什么
Kafka偏移量异常问题解答
endOffset大于最后可消费消息offset+1的原因
该问题的核心诱因是你启用了Kafka Streams的exactly_once_beta处理语义,该特性底层依赖Kafka事务实现:
- 事务生产者在写入过程中会预占分区偏移量,无论事务最终提交还是中止,已分配的偏移量不会被回收复用。
- 你观测到的offset 14位置实际被已中止事务的无效消息、或事务abort控制消息占用,这两类内容即使在
read_uncommitted隔离级别下,也不会作为业务消息返回给消费者,因此你能消费到的最后一条业务消息offset为13,而分区的endOffset直接推进到了15,最终出现endOffset大于最后可见offset+1的情况。
偏移量不连续与该现象的关联
两者完全相关,偏移量不连续是事务使用过程中的正常表现:
- 事务执行过程中生成的commit/abort控制消息本身会占用偏移量,但不会被消费者作为业务消息返回,天然会产生偏移量断层。
- 事务执行失败、写入重试等场景下,已经分配的偏移量不会被回收,也会导致业务消息的偏移量不连续。你观测到的1→4、5→8等偏移量跳变都是这类原因导致的,和你未配置日志压缩策略没有关系。
内容的提问来源于stack exchange,提问作者Evgeniy Berezovsky
相关产品推荐
相关产品推荐

