已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
我负责订单履约链路,Kafka 3.5(KRaft,3 broker),topic 16 分区、峰值 4k msg/s,消费组 8 实例。消费端是 at-least-once:拉取批次 → 逐条写 MySQL 8.0(业务表 + 幂等表)→ 批量提交 offset。社区已经把幂等表、状态机、中间态回滚聊得很透(#1594、#742、#940),但我最近复盘一次事故时发现一个还没被认真掰扯的盲区:offset 提交成功 ≠ 消息真正处理完成,两者之间存在一个「in-flight 窗口」,而我们对这个窗口完全是盲的。
上周一次 broker 切主,消费组触发 cooperative rebalance。事后对账发现:
inflight = 已拉取未提交 offset 的条数,rebalance 时上报。但发现两个坑:(a) 进程被 kill -9 时内存值直接蒸发,指标断崖归零,反而误导;(b) 多实例下 in-flight 是每实例本地状态,聚合到组维度只能靠上报,窗口期数据不完整。想请教社区有几种落法,最好能给出可复现的取舍依据:
committed - watermark 的差值作为「未确认消息量」——这个差值在 rebalance 前是有意义的吗?多实例抢分区时 watermark 语义会不会乱?另外想听大家拍砖:你们线上「offset 已提交但业务未完成」这个窗口,到底有没有被当成一等公民监控过? 还是说大家都默认「幂等表 + T+1 对账」兜底就完事了?如果是后者,那 rebalance 高频的集群(比如我们这种 8 实例 16 分区、每天 2~3 次 rebalance)的兜底成本你们算过账吗?