# consumer.properties
auto.offset.reset=latest
kafka-consumer-groups.sh --bootstrap-server kafka:9092 \
  --describe --group coupon-consumer

新消费组第一次上线,把 auto.offset.reset 写成 earliest,启动后开始消费三天前的消息,发券接口被重复调用,多发出 2.1 万张券。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,新 group 在 broker 上没有提交记录,earliest 会让它从最早可用位点开始,历史消息全部重放。发券逻辑只查了消息 id,没有按业务单号去重。

这次卡住的地方就在「Kafka 位点重置重放」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:新组上线前先用 kafka-consumer-groups 查是否已有位点;需要从当前开始就把策略改成 latest 并显式 seek 到末尾;发券按订单号建唯一索引 重复消息直接丢弃;已经多发的券按批次号回收。

改完只确认一件事:新组启动后第一条消息的时间戳接近当前时间 发券表按订单号没有重复行。

作者 9823189