题目:Kafka 中的 Offset 是什么?
难度:low
标签:db/mq/kafka, mq/kafka, general/knowledge, difficulty/low
评分:⭐⭐⭐☆☆(3/5)
Offset 在 Kafka 中主要指的是偏移量,用来描述当前消息在 Partition 中具体的位置是什么样子的。然后它的力度基本上是消息,消息在磁盘中的位置,力度是单条消息,然后消耗到消费者消费到什么地方了,用来记录这个的,当前消息在整体中的偏移量。作用就是为了快速能读取到这道消息,通过偏移量可以在数据磁盘中快速拿到这个消息。
优点:
不足:
__consumer_offsetsenable.auto.commit、commitSync vs commitAsync补充:
--from-earliest / --from-latest 和 offset reset 的基础核心考点定位:考察是否理解 Kafka 消费进度是如何被持久化和消费的,涉及"位点语义"和"位点存储"两个层面。
知识点拆解:
Log Start Offset:分区中最早的可读 offset(受 retention 和 log compaction 影响)Log End Offset (LEO):分区末尾下一个将写入的 offset/consumers/<group>/offsets/<topic>/<partition>__consumer_offsets(50 个分区,key = group+topic+partition),本质仍是 Kafka,性能更好、可用 consumer 语义查询enable.auto.commit=true,默认 5s):简单但可能重复消费commitSync:同步阻塞,保证提交成功,但性能差commitAsync:异步提交,性能好,但异常处理需要注意回调auto.offset.reset 无关,指 enable.auto.commit=false):业务逻辑完成后 commit,最能保证"至少一次"语义auto.offset.reset 三种策略:earliest / latest / none,仅在消费者组首次订阅且无 offset 记录时生效从「Offset 是什么」到「Offset 存哪」再到「Offset 如何提交」,构成完整链条。
考察方向:
__consumer_offsets Topic 内部结构(partition = hash(group+topic+partition) % 50)、offset 元数据本身也是 Kafka 消息(含 timestamp 和 commit offset)延伸递进面试题:
__consumer_offsets 读取最近一次 commit 的 offset;如果 commit 是异步的,可能出现重复消费kafka-consumer-groups.sh --describe 或 kafka-manager面试官您好,Offset 是 Kafka 消息在 Partition 内的唯一位置标识,从 0 开始单调递增,一旦分配不会复用。要唯一定位一条消息需要 (topic, partition, offset) 三元组——Kafka 本身没有全局唯一的 Message ID。
Offset 的作用主要有两个:第一,消费者通过指定 offset 来快速 seek 到磁盘对应位置读取消息;第二,消费者组通过持久化 offset 来记住"消费到哪了",重启后接着消费。
关于 offset 存哪,Kafka 0.9 之前存 ZooKeeper,从 0.9 开始改成存在内置 Topic __consumer_offsets 里,一共 50 个分区,key 是 group + topic + partition 的 hash,这样用 Kafka 自身来存储位点,性能更好,也支持用消费者语义查询历史。
关于怎么提交,有几种策略:自动提交默认 5 秒一次,简单但可能重复消费;手动提交里 commitSync 强一致但慢,commitAsync 性能好但异常处理要注意;生产中最常见的是"业务逻辑处理完后再手动 commitSync",这样能保证至少一次消费,避免出现业务处理成功但 offset 未提交的场景。
另外 auto.offset.reset 只有 earliest、latest、none 三个选项,只有在消费者组第一次订阅且没有历史 offset 时才会生效,之后都从提交的 offset 开始,跟这个配置没关系。