发布脚本 kill -9 掉消费进程,重启后从最新位点继续,业务库里少了 800 条已确认的支付回调,日志显示位点比最后处理完成的 offset 多出 1200。日志里能对上时间点,这种反而好排。

自动提交由客户端每 5 秒触发一次,提交的是当前 poll 到的位置,不是处理完成的位置。进程在提交之后、处理之前被杀,这段消息再也不会投递。这一点先确认清楚,后面就不用反复试。

props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false");
while (true) {
  ConsumerRecords<String,String> rs = consumer.poll(Duration.ofMillis(500));
  handle(rs);
  consumer.commitSync();
}

这次卡住的地方就在「Kafka 自动提交丢消息」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

报错里带路径的,先去看那个路径在不在、权限对不对。

处理上按这个顺序:关闭自动提交 改为处理成功后手动 commitSync;把单批 max.poll.records 降小 缩短未提交窗口;消费逻辑先写业务表再提交位点 顺序不要反;重启后按业务时间补一段区间核对。

结果对不对很好判断,再次 kill -9 后重启 业务表条数与 topic 总条数差值不超过当前这一批。

作者 9823189