系统架构设计师 · 高频练习

同一订单的创建、支付、退款消息怎样保证消费顺序?

高级 单选题 第 1075 题 较难 系统架构设计师消息队列分区键消息顺序订单事件
题目

订单事件流包含“创建、支付、发货、退款”。系统要求同一订单的事件按产生顺序消费,但不同订单可以并行处理。采用分区消息系统时,最合适的设计是()。

A 每条消息随机选择分区,以获得最均匀的负载
B 以orderId作为分区键,使同一订单进入同一分区,并按分区内顺序消费
C 要求所有订单共用一个全局锁和一个分区,且不考虑吞吐量
D 消费者收到消息后按事件名称字母顺序排序
题目类型:原创高频练习题 用途:用于帮助理解系统架构设计师相关考点和答案解析,不等同于官方真题。
正确答案
B
答案解析

顺序约束的范围是“同一订单”,因此分区键也应对应订单聚合边界。消息系统能保证的是分区内顺序,不是所有分区的全局顺序。

选项分析

A

错误。同一订单可能落入不同分区,消费者看到的先后无法保证。

B

正确。相同键稳定路由到同一分区,保留该分区的写入顺序。

C

不合适。虽然更容易形成全局顺序,但牺牲了题干允许的跨订单并行。

D

错误。事件名称不是业务发生顺序,且无法处理重试与重复。

本题为什么容易错

“消息有序”常被理解成全局只有一条队伍。多数业务真正需要的是聚合内有序;把范围缩到orderId、accountId一类业务键,才能兼顾扩展性。

先看结论

简短答案

同一订单的创建、支付、退款消息怎样保证消费顺序,正确答案是 B(以orderId作为分区键,使同一订单进入同一分区,并按分区内顺序消费)。顺序约束的范围是“同一订单”,因此分区键也应对应订单聚合边界。消息系统能保证的是分区内顺序,不是所有分区的全局顺序。

解析

易混淆概念对比表

概念本题判断区别要点记忆提示
每条消息随机选择分区,以获得最均匀的负载 本题干扰项 错误。同一订单可能落入不同分区,消费者看到的先后无法保证。 看到该词不要急着选,先判断是否真正解决题干问题
以orderId作为分区键,使同一订单进入同一分区,并按分区内顺序消费 本题正确答案 正确。相同键稳定路由到同一分区,保留该分区的写入顺序。 看到题干核心场景时优先联想到它
要求所有订单共用一个全局锁和一个分区,且不考虑吞吐量 本题干扰项 不合适。虽然更容易形成全局顺序,但牺牲了题干允许的跨订单并行。 看到该词不要急着选,先判断是否真正解决题干问题
消费者收到消息后按事件名称字母顺序排序 本题干扰项 错误。事件名称不是业务发生顺序,且无法处理重试与重复。 看到该词不要急着选,先判断是否真正解决题干问题
本题易混淆选项怎么区分
  • 每条消息随机选择分区,以获得最均匀的负载:错误。同一订单可能落入不同分区,消费者看到的先后无法保证。
  • 要求所有订单共用一个全局锁和一个分区,且不考虑吞吐量:不合适。虽然更容易形成全局顺序,但牺牲了题干允许的跨订单并行。
  • 消费者收到消息后按事件名称字母顺序排序:错误。事件名称不是业务发生顺序,且无法处理重试与重复。
复习

知识点详解

相同消息键通常会被路由到同一分区,消费者按分区中的记录顺序读取。不同分区可以并行,因此没有天然全局顺序。若单个键流量极大,还要评估热点、拆分聚合或采用序列号校验。

备考速记

顺序跟着业务键走:同一单同一队,不同单并行跑。

订单事件在订单事件场景中的作用

订单服务可把orderId作为键,并在事件中带上聚合版本号。消费者既利用分区顺序,也检查版本和幂等键,避免重试消息重复扣减库存。

拓展

同类题怎么考

  • 根据业务聚合选择消息分区键。
  • 判断消息系统顺序保证的边界。
订单事件在系统架构设计师软考中的考法

遇到有序题,先找题干限定词“同一用户、同一订单、同一账户”。能代表这个限定范围的字段通常就是候选分区键。

解题思路

先问一句:到底谁和谁必须有序?题干没有要求订单1001排在订单1002之前,只要求订单1001内部不能先退款后支付。orderId正好是这个顺序边界,所以选 B。

考点定位

局部有序与并行吞吐可以兼得:同一业务键进同一分区,不同键分散到多个分区。

易错提醒

  • 生产者重试后改变分区策略,导致同一键被路由到别处分区。
  • 分区内有序却让多个线程并发更新同一订单,应用层又打乱顺序。
  • 选择商户ID等低离散键,造成热点分区。

备考提示

  • 先确定有序范围,再选择能代表该范围的分区键。
  • 复习时把局部有序、全局有序、幂等和重复消费分开。

你可能还想了解

  • Kafka如何保证同一订单消息有序?
  • 分区内有序和全局有序有什么区别?
  • 分区键选orderId有什么风险?

本文小结

以订单ID作为分区键可保证同一订单事件进入同一分区并按序消费,同时保留不同订单的并行能力。