标准答案

  1. 单个分区或单个队列消费者可以维持局部顺序,但多个分区、多个生产者、重试和故障恢复都会使全局顺序难以低成本保持。
  2. 应先识别真正的顺序范围,例如同一订单的创建、支付、取消必须有序,而不同订单之间通常不需要互相等待。
  3. 把同一业务 Key 路由到同一分区,并在消费者端按状态机、版本或序号拒绝过期事件,可以在保留并行度的同时保证业务正确。
  4. 若确实需要全局序列,必须接受单分区或全局协调的吞吐上限、故障域和恢复复杂度,并明确它是否真的值得。

题目解析

很多所谓顺序问题实际是状态校验问题。即使消息到达顺序不稳定,只要处理端只接受合法的状态转移,旧事件也不会把订单从已支付改回待支付。

重试和死信重放会让旧事件晚到,因此仅靠队列顺序不够。事件中携带业务版本、发生时间和幂等 ID,才能帮助消费者做判断。

常见误区

  • 为了所有用户的全局顺序把全部消息塞进一个分区。
  • 认为同一分区就永远不会有重复、重试和延迟到达。

作者信息