Apache Kafka OffsetOutOfRangeException:直接 reset earliest 可能让历史重复入账【Kafka合集】
Consumer 保存的 offset 已被 retention 删除恢复时抛出越界异常。直接设earliest可能重放仍保留的全部历史给支付、通知和库存制造重复副作用。越界只说明“请求位置不在当前日志范围”并没有替业务决定应该丢弃缺口、从头重放还是从某个业务恢复点续跑。先区分两种越界条件常见原因风险committed offset log start offsetGroup 停摆超过 retention、手工删减保留期缺失区间已不在本地日志earliest 也找不回来requested offset log end offsetTopic 重建、日志截断、错误迁移位点latest 会跳过本应恢复的数据earliest 可能大范围重放因此排障必须保存每个分区的committed、earliest、latest和业务最后成功事件而不是对整个 Group 使用同一个 reset 策略。只读确认日志边界bin/kafka-consumer-groups.sh --bootstrap-server broker:9092\--describe--groupexpired-offset-probe bin/kafka-get-offsets.sh --bootstrap-server broker:9092\--topicshort-retention-test--timeearliest bin/kafka-get-offsets.sh --bootstrap-server broker:9092\--topicshort-retention-test--timelatest这些命令只读。将输出按 TopicPartition 合并后再用事件 ID、业务版本或下游事务记录确定可接受恢复点。若缺失区间已经被保留策略删除只能从归档、上游事实库或其他恢复源补数earliest无法恢复不存在的日志。reset 是变更不是诊断命令先使用--dry-run预览并保存原位点真正执行前停止 Group 活动实例精确限定 Topic/分区和目标 offset。出现重复扣款、库存回退、下游压力越界或恢复点判断错误时立即停止并恢复保存的原位点。对于有副作用的消费端必须先证明事件 ID 幂等或建立去重账本。源码与 Java让越界显式失败而不是静默跳转以下源码定位与 Java 示例按 Kafka 4.3.1 静态审阅未在本环境运行测试需使用短保留期的隔离 Topic不得缩短生产 Topic 保留期来复现。客户端 Fetch 路径位于FetchCollector和SubscriptionStateauto.offset.resetnone会把无法自动恢复的位置暴露为异常。importjava.time.*;importjava.util.*;importorg.apache.kafka.clients.consumer.*;importorg.apache.kafka.common.serialization.StringDeserializer;publicclassOffsetRangeProbe{publicstaticvoidmain(String[]args){PropertiespnewProperties();p.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,localhost:9092);p.put(ConsumerConfig.GROUP_ID_CONFIG,expired-offset-probe);p.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,none);p.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class);p.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class);try(KafkaConsumerString,StringcnewKafkaConsumer(p)){c.subscribe(List.of(short-retention-test));try{c.poll(Duration.ofSeconds(10));}catch(OffsetOutOfRangeExceptione){System.err.println(e.offsetOutOfRangePartitions());throwe;}}}}auto.offset.resetnone的价值是阻止客户端替业务自动选 earliest/latest。捕获异常后应记录各分区越界位置并停止处理由恢复流程作出受审计的位点决策。恢复验收与预防技术上核对新 committed offset 单调推进、Lag 收敛、没有再次越界业务上按事件 ID 对账重放窗口确认缺口补齐且副作用去重。预防重点是让 retention 覆盖最长停机与恢复时间、监控 Group 停滞年龄并为关键 Topic 保留可验证的归档或上游重建路径。