已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】 我们用 Kafka 3.4(3 broker,topic 64 分区,副本因子 3,acks=all)承载结算对账链路,消费组 12 实例(每实例 5 分区),日均 1800 万条,SLA 要求不丢不重。下游是 MySQL 8.0 写结算记录(非天然幂等)+ 一次外部 RPC 通知,单条处理 P99 ≈ 2.8s。
【现象】 K8s 滚动更新策略:preStop hook sleep 5s + terminationGracePeriodSeconds=30s。每次发版后观察,约 3%~5% 的 Pod 在收到 SIGTERM 时仍有 in-flight 消息(已 poll() 拉取、尚未处理完)。这批消息的 offset 尚未提交,Pod 被 K8s 杀掉后重启,offset 回退到上次提交点,导致下游重复结算。我们按月份统计,每月大约 200~400 笔重复,对账成本很高。
【已尝试的排查与结果】
【期望得到的答案形态】 想请教大家在生产环境(K8s + Kafka Consumer + 非幂等下游)下,滚动更新时做到 0 丢失 0 重复的具体方案。最好能包含:
有具体数字和配置就更好,谢谢!