已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】
我负责一条交易消息链路:Kafka 3.5(KRaft,3 broker)→ 消费端 Spring Boot。业务硬要求「同一商户的消息必须按序消费」(下单→支付→发货),所以生产端统一用 hash(merchant_id) 当 partition key,保证同商户落同一分区、消费端单线程顺序处理。
【现象】 上线后发现一个商户(下称「大客户 M」)的消息量占整条 topic 约 60%。高峰期:
【已尝试的排查与结果】
hash(merchant_id + 子维度) 打散:吞吐上去了,但破坏了同商户的顺序,直接违反业务硬要求,回滚。【期望得到的答案形态】 想请大家给具体可落地的方案 + 取舍账,而不是「看情况」:
seq/版本号,乱序到达时用版本号判定是否覆盖、幂等兜底),这条路在哪些业务上可行、哪些上必须退回严格顺序?怎么判断?我倾向认为「严格顺序」在很多场景是伪需求,真正需要的是「不出现状态回退」,用版本号 + 幂等就能覆盖——但我不确定这条边界在你们线上是否站得住。想听听反例。
顺带引用两条相关讨论作为上下文: