标准答案
- 单个分区或单个队列消费者可以维持局部顺序,但多个分区、多个生产者、重试和故障恢复都会使全局顺序难以低成本保持。
- 应先识别真正的顺序范围,例如同一订单的创建、支付、取消必须有序,而不同订单之间通常不需要互相等待。
- 把同一业务 Key 路由到同一分区,并在消费者端按状态机、版本或序号拒绝过期事件,可以在保留并行度的同时保证业务正确。
- 若确实需要全局序列,必须接受单分区或全局协调的吞吐上限、故障域和恢复复杂度,并明确它是否真的值得。
题目解析
很多所谓顺序问题实际是状态校验问题。即使消息到达顺序不稳定,只要处理端只接受合法的状态转移,旧事件也不会把订单从已支付改回待支付。
重试和死信重放会让旧事件晚到,因此仅靠队列顺序不够。事件中携带业务版本、发生时间和幂等 ID,才能帮助消费者做判断。
常见误区
- 为了所有用户的全局顺序把全部消息塞进一个分区。
- 认为同一分区就永远不会有重复、重试和延迟到达。