标准答案

  1. 将同一订单或 SKU 映射到同一分区或串行队列,可以保证相关事件按顺序处理。
  2. 不同 Key 之间通常没有业务依赖,可以并行消费,从而提高吞吐和降低单点阻塞。
  3. Key 选择要避免热点,并在扩容、重分区和重放时保持可解释的顺序边界。
  4. 即使有局部顺序,重复和迟到事件仍需通过版本或状态机保护。

题目解析

大多数业务只要求同一订单、用户或库存对象的事件有序,不要求无关对象之间互相等待。按业务 Key 分区可以保留局部顺序,同时让不同 Key 并行处理。

Key 设计决定负载是否均匀。单个大租户、热门商品或固定默认 Key 可能形成热点,即使总分区数很多也无法提高该 Key 的处理能力。

顺序只能减少乱序,不会防止重复、重放和过期事件。消费端仍需用事件 ID、领域版本或状态机判断事件是否已经处理或已经过时。

常见误区

  • 误区:为了简单要求所有消息全局有序。改正:只对共享不变式的业务 Key 保序,避免一个慢事件阻塞无关业务。
  • 误区:Key 选择造成热点分区。改正:根据真实流量评估 Key 分布,并为热点对象设计拆分或串行化策略。
  • 误区:把顺序保证当成幂等保证。改正:顺序队列仍可能重投和重放,消费者必须保存处理证据。

作者信息