想象你正在策划一场城市音乐节。主舞台有完整节目单、灯光脚本和音控预案,总导演在后台拿着对讲机控场:几点开场、哪个乐队接上、灯光何时熄灭、音浪如何切换——所有环节像齿轮一样咬合推进。这就是服务编排(Orchestration):一个中心角色按既定乐谱掌控全局协作。而在园区另一角的自由舞台上,几个街头乐手没有导演也没有节目单:鼓手先敲出节奏,吉他手听见后即兴跟上,键盘手顺着气氛补上一段旋律——大家听着彼此的声音自发行动,居然也凑出一场精彩的演出。这就是服务编制/编舞(Choreography):没有中心指挥,靠事件和默契推动协作。微服务架构里,服务与服务的协作同样存在这两种截然不同的“演出风格”。这篇文章就用音乐节的视角,帮你彻底看懂它们的分工、优劣与选型方法。

岗位关联

编排与编制是分布式架构设计的“元问题”。理解两者的状态、失败与扩展差异,能让你在系统设计、故障排查和架构评审时做出有底气的专业判断。

目录
  1. 可视化演示
  2. 集中编排模式:主舞台的总导演
  3. 事件编制模式:自由舞台的即兴演出
  4. 状态管理对比:谁记着“演到哪了”
  5. 失败处理对比:跑调了谁来救场
  6. 扩展性对比:乐队规模翻倍时谁先崩
  7. 适用场景边界:不同曲目选不同舞台
  8. 工程实践选型:乐队怎么组
  9. 生产案例复盘:音乐节落幕之后的复盘
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

对比编排(中央协调器驱动)与编制(去中心化事件驱动)两种模式,支持流程速度调节。

本节配有交互动效(进入视口后自动加载,约 3KB)。

服务编排模式 紫色中央协调器显式驱动各服务按序执行 青色各服务被动响应协调器调用,无直接交互 Orchestrator → Service A → B → C → D 命令式集中控制,易于追踪与补偿

集中编排模式:主舞台的总导演

音乐节主舞台的后台,总导演拿着打印好的节目单,对着对讲机逐条下令:“弦乐组准备,灯光暗三档,主唱就位……”任何一支乐队想临时加演,都必须先过导演这关,因为整场演出的节奏、串场、应急预案都写在这张节目单上。这种“一切听中央指挥”的协作方式,就是服务编排的定义——业务流程由一个中央协调器(Orchestrator)统一指挥,各服务按指令执行。

在技术世界里,编排表现为一个显式的协调服务。它拿着“乐谱”——一张明确定义了步骤顺序的工作流——依次调用各微服务。比如电商下单:协调器先调支付服务、再调库存服务、最后调物流服务,每一步都等结果返回后再走下一步。业界常用 Temporal、Camunda 或 AWS Step Functions 来实现这种工作流引擎。编排的核心假设是:流程是有序、可预期、可审计的。

但这种集中也带来了代价:由于每个步骤都串行等待,整个调用链的耗时是步骤耗时的累加,协调器成为所有流量必须经过的“剧场大门”。

所以节目单越长的演出,总耗时越长,且任何一步延误都会拖慢全场。编排适合那些流程稳定、顺序严格、需要随时回答“现在演到哪了”的主舞台场景。

Torch=∑i=1ntiT_{orch} = \sum_{i=1}^{n} t_i
编排模式的端到端延迟,等于每个服务调用耗时之和——像节目单上所有环节顺序进行,总时长是各环节时长相加。
  1. T_orch 端到端耗时整个编排流程从收到请求到最终完成的总体时间。
    TorchT_{orch}
  2. 求和号数学里表示把若干项累加起来,这里表示把每一步消耗的时间依次叠加。
    ∑i=1n\sum_{i=1}^{n}
  3. t_i 单步耗时第 i 个服务完成一次调用所花费的时间,i 从第 1 步一直到第 n 步。
    tit_i

事件编制模式:自由舞台的即兴演出

街头的自由舞台没有总导演。鼓手敲响第一下,吉他手用耳朵捕捉节奏,顺势加入一段和弦;贝斯手听见旋律后补上低音;键盘手最后用一段副歌把所有人黏合在一起。没有人下达命令,但演出依然完整——因为每个人都在监听别人发出的声音(事件),并基于共同默契做出反应。这种“靠事件自然推进”的协作,正是服务编制的核心。

在架构上,编制模式使用事件总线(如 Kafka、RabbitMQ)作为“公共广场”。每个服务既是事件的发布者,也是订阅者:支付完成后,支付服务发布“支付成功”事件;库存服务订阅这个事件,收到后扣减库存并发布“库存已扣”事件;物流服务接着响应……业务流程隐性地串联在这些事件的传递链中,没有任何中心节点保存全局进度。

这种模式下,各服务是并行演化、各自伸缩的。正因为没有中心等待,系统总吞吐量取决于各条事件链中“最长的那一条路径”而不是所有环节的简单相加——多个服务可以同时开工。

自由舞台的强项是灵活和蓬勃的并发;弱点是“没人说得清现在整体演到哪了”。后面章节将看到,这正是状态管理和故障排查难度的来源。

Tchor=max⁡k∈paths(∑i∈pathkti)T_{chor} = \max_{k \in paths}\left(\sum_{i \in path_k} t_i\right)
编制模式的整体耗时,取决于并行的多条事件链中最慢的那条——如同多个街头小舞台同时开演,整片园区的“热闹程度”由时间最长的演出决定,而不是所有演出时间的总和。
  1. max 最大值在多条并行的事件链中,挑出耗时最长的一条来代表整体耗时。
    max⁡k∈paths\max_{k \in paths}
  2. 路径集合 paths事件流可能分出多条分支链,每条链都有自己的串行步骤。
    pathspaths
  3. 链内求和每条分支链内部的步骤耗时仍然相加,但不同链之间是并行关系。
    ∑i∈pathkti\sum_{i \in path_k} t_i

状态管理对比:谁记着“演到哪了”

主舞台的总导演口袋里永远揣着一份“进度记录”:上一个节目几点结束、下一个舞台何时清场、哪个灯光师正在待命。做编排时,这个进度记录就是协调器的状态库,它集中保存每一个流程实例走到哪一步,方便随时查询和回溯。而在自由舞台,每个乐手只记得自己演奏到哪个小节——没有人拥有全局进度单,整个园区演出的完整画面,只能靠事后把每个乐手的记忆拼起来。

编排模式把状态放在协调器内部:工作流引擎会持久化流程实例的当前步骤、上下文数据和跳转历史。遇到问题可以随时恢复现场。编制模式则把状态打散在每个服务的本地存储里:每个服务自己记录“我处理过哪些事件、当前业务状态是什么”。要了解全局,只能通过事件溯源(Event Sourcing)把各服务的本地状态当作一组快照来拼接。

因此两种模式的一致性策略也不同:编排常用补偿式一致性(Saga),通过协调器记录每一步并准备“悔棋”动作;编制则依赖幂等设计和最终一致性,允许系统短暂地“各说各话”,随后收敛。

这就像音乐节组织方想要“此刻全场有哪些演出在进行”,编排模式下直接问总导演即可;编制模式下得请各舞台的乐手分别汇报,再手工拼出全貌——通常要晚上几分钟。

Sglobal=S1∪S2∪⋯∪SnS_{global} = S_1 \cup S_2 \cup \cdots \cup S_n
编制模式下全局状态 = 各服务本地状态的并集。没有任何一个组件能回答“全局状态是什么”,只能多方合起来看。
  1. S_global 全局状态业务实例跨多个服务后的整体状貌。
    SglobalS_{global}
  2. 并集符号把所有服务各自保存的状态合并在一起,才构成真正的全局视图。
    ∪\cup
  3. S_i 单项服务状态第 i 个服务在自己数据库/存储中记录的那一部分状态。
    SiS_i

失败处理对比:跑调了谁来救场

主舞台演出时,如果某支乐队突然赶不上场,总导演能立刻察觉,并启动预案:让下一个乐队顶替、临时插入一个串场表演、通知灯光切到应急模式。编排模式天生具备这种“总览全局的应急能力”——协调器知道每一步的上下游,当中间某个服务失败时,可以发起补偿事务:调用已经执行过服务的“撤销逻辑”,把之前扣的钱、锁的库存逐一回滚,把业务恢复到起点。

自由舞台呢?如果一个乐手弹错了音,其他乐手不一定立刻知道;只有当错误导致节奏明显断裂时,大家才会回头用眼神和重复乐句慢慢找回状态。编制模式面临同样的困境:一个服务处理事件失败后,并没有一个中心角色自动补救。它只能依赖消息重试——把失败事件放回重试队列,由消费方保证幂等,等网络或依赖恢复后再试。事件链越长,静默失败的概率越高,定位越费力。

用数学语言描述,编排模式的成功率问题也很直观:如果每个步骤的成功率都是 p,端到端的成功概率会按串行链路相乘。因此编排模式对失败处理的核心武器是“显式补偿”,而编制模式的武器是“多次重试 + 最终一致”。

主舞台的优势是“有人管”,补救迅速;自由舞台的优势是“不依赖人”,但出了问题像大海捞针。这也解释了为什么核心交易场景往往选择编排,而外围通知、日志类场景更放心交给编制。

Psuccess=p1×p2×⋯×pnP_{success} = p_1 \times p_2 \times \cdots \times p_n
当多个串行步骤串联时,整体成功概率等于各步骤成功率的乘积。每多一个环节,成功概率就“打折”一次。
  1. P_success 整体成功率整个业务流程最终能成功完成的概率。
    PsuccessP_{success}
  2. 乘号链串行步骤越多,失败风险不断累积,成功率逐项相乘。
    ×\times
  3. p_i 单步成功率第 i 个环节本身的成功率,通常小于 1。
    pip_i

扩展性对比:乐队规模翻倍时谁先崩

当音乐节从 10 个乐队扩展到 100 个乐队,总导演会发现自己成了最忙的人:所有协调指令都经过他,对讲机几乎要被喊爆。编排模式的瓶颈,正是这个中央协调器——它是名副其实的“单点剧场大门”,所有请求都从它进出,系统的并发上限天然被它的处理能力锁死。虽然可以让协调器集群化,但集群本身又引入新的协调成本。

自由舞台则几乎没有这个烦恼:多开几个街角,多叫几组街头艺人,各自即兴演奏就行。编制模式里,新增一个服务只需要让它订阅相关事件,不需要注册到任何中心;已有的服务也可以按需水平扩展,互相之间没有感知。数据层面用分区、多副本,消息层面靠消费者组扩缩容,整个系统的容量近似等于各服务容量之和。

更直观的对比是性能开销:编排模式每次服务间调用都经过“请求-响应”的完整往返,而且协调器本身要存储和查询流程状态,额外开销明显;编制模式通过异步事件传递,虽然引入了消息总线的序列化成本,但整体吞吐更高、削峰填谷能力更强。

换句话说,想要让千人交响乐团不乱,指挥家必须极其强大;而让十个自由舞台同时热闹,只需要把舞台和艺人铺开即可。

Qorch≤qcoordinator,Qchor≈∑i=1nqiQ_{orch} \le q_{coordinator}, \qquad Q_{chor} \approx \sum_{i=1}^{n} q_i
编排系统总吞吐受限于协调器单点容量;编制系统总吞吐近似等于各服务吞吐之和,因为每个服务都能独立扩容。
  1. Q_orch 编排总吞吐系统每秒能处理的请求量上界。
    QorchQ_{orch}
  2. 小于等于 q_coordinator协调器的处理能力成为整个系统的天花板。
    ≤qcoordinator\le q_{coordinator}
  3. Q_chor 编制总吞吐事件驱动系统中,总容量约等于每个服务各自吞吐量累加。
    Qchor≈∑i=1nqiQ_{chor} \approx \sum_{i=1}^{n} q_i

适用场景边界:不同曲目选不同舞台

音乐节不是只有一种舞台:主舞台需要严格的流程控制、昂贵的灯光音响和连贯的转播,适合交给总导演全权编排;自由舞台则追求气氛、随性和创造力,交给乐手即兴更为合适。架构决策也是如此——编排与编制并无绝对的优劣,只有合适与不合适。

一个实用的判断指标是看业务交互复杂度:如果参与的服务少、步骤严格、顺序固定,比如支付-扣库存-发货,排列组合的可能性有限,编排模式清晰直观、便于审计,是更好的选择。如果业务需要面对大量并行参与者、事件类型不断增长、外部系统的反馈时机不可控,比如物流轨迹聚合、社交 Feed 通知、物联网设备联动,编制模式更能承载这种动态复杂性。

生产中真正的主流不是二选一,而是混合模式:把核心主流程用编排牢牢锁住,把外围可独立演进的环节用事件编制放开。比如订单核心链条(支付、风控、库存)走编排,确保强一致性;而短信通知、积分发放、推荐刷新等非关键环节走事件驱动,让它们异步、轻量地跟上。这种架构被戏称为“用指挥家控主舞台,让自由舞台自己热闹”。

打比方说,如果一首曲子只有三个和弦、十几个小节,找指挥纯属浪费;如果是一场多支乐队轮番上阵、还要配合灯光转播的大型演出,没有指挥一定乱套。识谱,才知道该请谁来控场。

Cdecision=NinteractionsNservicesC_{decision} = \frac{N_{interactions}}{N_{services}}
当一个业务中服务之间的交互数除以服务数的比值很高,说明协作密集、关系复杂,需要决策者更谨慎地权衡编排与编制的边界;比值低、链路规整时,编排往往更省心。
  1. C_decision 复杂度判定指标用来粗略评估一个业务场景适合集中还是分散协作。
    CdecisionC_{decision}
  2. N_interactions 交互数业务过程中服务之间需要发生的总关联次数。
    NinteractionsN_{interactions}
  3. N_services 服务数参与该业务的服务总个数。
    NservicesN_{services}

工程实践选型:乐队怎么组

选编排还是编制,很多时候不是技术问题,而是组织问题。总导演模式要求一个强势且有全局视野的协调团队;即兴模式要求每一位乐手都有过硬的业务理解和默契。换成技术语言:编排模式把流程集中起来,业务人员、QA、开发都可以对着同一份流程定义评审,协作门槛低;编制模式则要求多个服务团队对齐事件契约、版本兼容和消息格式,对团队的契约管理能力要求很高。

可观测性是另一个关键考量。编排模式下,协调器自带流程追踪,一条 Trace 走完,故障在哪个节点一目了然。编制模式没有天然的全链路追踪,必须额外搭建事件轨迹管道,为每个事件绑定全局 TraceId,否则排查起来就像在几十段即兴录音里找人声——极其痛苦。如果团队的监控基础设施不够成熟,贸然全面编制化很容易陷入“线上事故三小时定位不了”的境地。

演进路线上,务实的做法是“先编排,后渐进式编制”:新业务起步时流程简单,用编排模式把业务逻辑显式跑通;当业务复杂度上升、部分链路需要独立扩展时,再把这些链路改造成事件驱动。改造过程中注意保留流程版本和契约测试,避免一把梭导致上线后全线崩溃。

生产案例复盘:音乐节落幕之后的复盘

音乐节结束,制作团队围坐复盘:主舞台演出,因为总导演预案充分,各环节严丝合缝,几乎没有失误;自由舞台的即兴演出,虽然有过几次乐手跟不上拍的小插曲,但整体反而因为“意外感”成了观众最津津乐道的部分。两种模式各有高光时刻,也各有短板——这正是真实生产环境里无数系统迭代后得到的经验。

电商订单编排是编排模式的经典阵地:下单、支付、锁库存、开发票,步骤固定、流程必须可审计,失败时能即时补偿。由订单中心担任总导演,用状态机或工作流引擎串起所有环节,保证每一单都“心里有数”。物流事件编制则是编制模式的代表:快递从揽收到签收要经过十几个网点,每个网点独立操作并上报轨迹事件,总部大数据平台订阅全部事件流,最终拼出完整物流轨迹。这个过程参与者众多、时序不完全固定、事件可以并行发生,强行找一个中心来指挥反而低效。

最宝贵的架构演进经验来自一次大促复盘:某平台最初所有节点都走同步编排,结果订单峰值一到,协调器 CPU 打满、响应飙升。后来团队把通知、积分、推荐等非核心链路全部切到事件总线,只让支付和库存留在编排链路里,整体吞吐提升了近三倍。这个故事说明:编排保证核心,编制释放外围,是大型分布式系统里最务实的姿态。

AI 应用场景

AI场景一:智能故障定位(AIOps)

阶段:数据采集与异常检测

解决的问题:编制模式下各服务自主响应事件,一旦出现“订单卡住”这样的症状,传统手段需要在几十个服务日志里人工找关联,平均耗时数小时。AI 运维平台通过采集全链路 Trace 和事件流日志,用图神经网络自动构建服务调用关系图,把“支付成功但没有扣库存”这类异常快速定位到具体的事件断裂点。

具体案例:某物流平台每天处理上亿条轨迹事件。当某个城市节点上报延迟时,AI 系统自动关联该节点的上游事件源、下游消费者和消息队列积压量,在 3 分钟内给出“事件积压在转运中心 MQ 分区”的诊断报告,而人工排查此前平均需要 2 小时。

AI场景二:自适应流程路由

阶段:模型推理与决策

解决的问题:业务运行中,有些请求适合走“主舞台式”的严格编排,有些请求则应该走“自由舞台式”的异步事件流。传统静态配置难以适配动态流量特征。AI 路由组件通过在线学习历史请求的特征(业务类型、用户等级、当前系统负载、风控分数),预测每条请求的最佳路径——高风险或核心交易走编排,低风险或海量通知类请求走编制。

具体案例:一家支付公司在网关层部署轻量级排序模型,仅在流量高峰时动态将积分发放、消息推送等非关键调用切到异步事件总线,错误率下降 40%,主流程 P99 延迟降低 35%。

Python 演示

python91 行
# 服务编排 vs 服务编制 最小模拟import random  class Service:    def __init__(self, name, fail_rate=0.05):        self.name = name        self.fail_rate = fail_rate     def execute(self, payload):        if random.random() < self.fail_rate:            raise RuntimeError("{}失败".format(self.name))        return "{}完成:{}".format(self.name, payload)  class Orchestrator:    """编排模式:由一个中央协调器按顺序指挥各服务"""    def __init__(self):        self.pay = Service("支付")        self.stock = Service("扣库存")        self.ship = Service("发货")     def run_order(self, order_id):        steps = [self.pay, self.stock, self.ship]        try:            for step in steps:                print(step.execute(order_id))            return "订单流程成功"        except RuntimeError as err:            print("触发补偿逻辑:", err)            return "订单流程失败"  class EventBus:    """事件总线:发布事件,订阅方自行响应"""    def __init__(self):        self.handlers = {}     def on(self, event_name):        def decorator(func):            self.handlers.setdefault(event_name, []).append(func)            return func        return decorator     def publish(self, event_name, payload):        print("[事件] {} 发生".format(event_name))        for handler in self.handlers.get(event_name, []):            handler(payload)  bus = EventBus()  @bus.on("订单创建")def handle_payment(payload):    svc = Service("支付")    try:        print(svc.execute(payload))        bus.publish("支付完成", payload)    except RuntimeError as err:        print("支付失败:", err)  @bus.on("支付完成")def handle_stock(payload):    svc = Service("扣库存")    try:        print(svc.execute(payload))        bus.publish("库存扣减完成", payload)    except RuntimeError as err:        print("扣库存失败:", err)  @bus.on("库存扣减完成")def handle_ship(payload):    svc = Service("发货")    try:        print(svc.execute(payload))    except RuntimeError as err:        print("发货失败:", err)  if __name__ == "__main__":    print("===== 编排模式 =====")    orch = Orchestrator()    for i in range(3):        print("result:", orch.run_order("order-{}".format(i)))     print()    print("===== 编制模式 =====")    bus.publish("订单创建", "order-100")
目的:用两个可运行的小模型分别演示“编排模式”(中心协调器依次指挥)和“编制模式”(各服务通过事件总线自发接力),直观对比两种协作方式的代码组织差异。
  1. class Orchestrator:相当于音乐节的“总导演”,所有流程步骤都集中在这里定义和调度
  2. steps = [self.pay, self.stock, self.ship]把业务流程写成一张显式的“节目单”列表
  3. for step in steps:总导演按节目单顺序逐项挥动指挥棒,先支付、再扣库存、最后发货
  4. except RuntimeError as err:任一步骤失败立即捕获,进入“救场/补偿”逻辑
  5. class EventBus:相当于自由舞台的“公共广场”,所有人都能在此发布或订阅消息
  6. def on(self, event_name):服务注册自己关心的“乐句”(事件),一旦出现就自动响应
  7. def publish(self, event_name, payload):像一个乐手向人群喊出旋律,所有订阅了这个旋律的人都开始行动
  8. bus.publish("订单创建", "order-100")向事件总线发起第一声“开场鼓点”,后续动作全部自动接力

常见误区

误区认为编排模式的中心协调器会“单点爆炸”,所以小项目用编排、大项目必须用编制。

正解系统规模大不等于就该用编制。决定因素是流程的“确定性”:只要业务流程步骤固定、顺序严格、需要审计,哪怕服务数量再多也适合编排。协调器可以做集群化、分片化部署来消除单点压力。真正不适合编排的是那种事件类型爆炸、参与方随时变化的场景。

为何常见:很多人把“中心协调”与“单点瓶颈”画等号,却忽略了协调器本身也是可以被水平扩展的。规模大只是表象,流程的确定性才是本质。

误区认为服务编制是“去中心化”,所以每个服务可以随心所欲,不需要任何统一约束。

正解编制模式去的是“中央控制点”,不是“协调规则”。服务之间依然通过事件契约(消息格式、版本、语义)进行隐式协调,还需要约定幂等规则、重试策略和最终一致性收敛方式。契约管理不到位,自由舞台会变成噪音场。

为何常见:“没有中心节点”容易让人误以为“没有规则”,其实是规则从“程序代码”转移到了“事件协议”之中,协调成本换了一种形态存在。

误区看到编排的串行调用链和中心开销,就认定编排性能一定差,遇到性能问题就考虑全量迁移到事件驱动。

正解编排的延迟开销主要来自串行链路和协调器处理,但异步调用、并发分支可以显著压缩耗时;而编制虽然并行度高,却引入了消息序列化、持久化、重试等额外成本,事件链过长时端到端延迟未必更优。性能问题应该先做链路分析和瓶颈定位,而不是盲目换模式。

为何常见:人们习惯用“中心=慢、分散=快”的直觉做判断,忽略了分布式系统中异步消息的追加时延和最终一致性代价,真正的高性能来自合理的并行度设计,而不是简单地放弃中心。

误区认为只有编排模式才能保证数据一致,编制模式一定会产生脏数据。

正解分布式环境下两种模式都无法获得传统意义的强一致性。编排用补偿事务提供“可预测的回滚路径”,编制用幂等 + 事件溯源 + 最终一致性让系统在短暂不一致后自发收敛。如果业务能容忍秒级收敛窗口,编制完全可以满足一致性要求;如果必须在用户请求内反馈结果,编排更合适。

为何常见:把“没有中心调度”等同于“没有一致性保障”,忽略了最终一致性也是一种被广泛验证的正确性保证。一致性是约束等级问题,不是架构模式问题。

面试题

Q1. 服务编排模式最核心的特征是什么?

单选题 · easy

  • A.使用消息队列做异步通信
  • B.由中央协调器统一控制流程← 正确答案
  • C.每个服务独立自主决策
  • D.服务之间仅靠事件联动

答案:B。编排模式的定义就是存在一个中央协调器,像总导演一样按乐谱调度各服务。A 和 D 描述的是事件驱动特征,C 是编制模式的写照。区分编排与编制的第一眼,就是看有没有“中心”。

Q2. 在编排模式中,业务流程的走向通常保存在哪里?

单选题 · mid

  • A.各服务自己维护的私有清单
  • B.中心协调器的工作流引擎← 正确答案
  • C.事件总线的消息记录
  • D.每个消费者的本地缓存

答案:B。编排模式由协调器持有流程定义与实例状态,类似总导演手里的节目单进度记录。B 正确。事件总线记录的是消息而非流程定义,服务本地缓存更不可能保存全局流程。

Q3. 编制模式的主要劣势是什么?

单选题 · mid

  • A.新的微服务很难加入系统
  • B.业务流程的可追踪性较差← 正确答案
  • C.完全无法实现事务补偿
  • D.必须使用同步阻塞式通信

答案:B。编制模式去中心化后,全局流程分散在各事件链中,可追踪性差、故障定位难。它并不排斥新服务加入,也并非不能实现补偿,更不要求同步通信。B 是它最常被诟病的软肋。

Q4. 编制模式对系统设计提出了哪些额外要求?(多选)

多选题 · mid

  • A.消费方服务必须保证幂等← 正确答案
  • B.事件契约变更要向后兼容← 正确答案
  • C.必须有独立的中心编排器
  • D.需要设计消息重试机制← 正确答案

答案:ABD。编制模式没有中心协调器兜底,消费方必须幂等防止事件重复处理;事件契约经常跨团队演化,必须向后兼容;失败消息需要重试机制保证最终完成。C 正是编制模式要避免的。

Q5. 某业务有 5 个串行步骤,每步成功率均为 0.99,端到端成功率约为多少?

单选题 · mid

  • A.约 0.951← 正确答案
  • B.约 0.975
  • C.约 0.990
  • D.约 0.999

答案:A。串行链路成功率等于各步骤成功率相乘,0.99 的 5 次方约等于 0.951。这说明每增加一个环节,整体成功率都会“打折”,也是编排长链路必须配套补偿机制的原因。

Q6. 服务编制模式通常使用哪种通信方式?

单选题 · easy

  • A.同步 HTTP 远程调用
  • B.消息事件总线发布订阅← 正确答案
  • C.数据库事务内直接写入
  • D.共享文件系统读写传递

答案:B。编制模式依赖事件总线(如 Kafka、RabbitMQ)做发布订阅,服务间互不直接调用。A 是编排风格的通信,C 和 D 属于跨服务的反模式。

Q7. 下列哪些情形适合从编排模式演进到编制模式?(多选)

多选题 · hard

  • A.协调器成为高并发下的流量瓶颈← 正确答案
  • B.业务出现大量可并行的事件分支← 正确答案
  • C.要求所有步骤必须严格串行审计
  • D.外围服务需要独立扩展和弹性伸缩← 正确答案

答案:ABD。协调器成为瓶颈、业务并行分支增多、外围服务需要独立伸缩,都指向事件驱动化。C 强调严格串行审计,恰恰是编排模式的优势场景,不应迁移到编制。

Q8. 使用编制模式时,如何有效保证事件不丢失?

单选题 · hard

  • A.让协调器定期重发所有事件
  • B.事件持久化并采用可靠投递机制← 正确答案
  • C.所有服务循环发送事件直到成功
  • D.发送前先写入共享文件系统

答案:B。可靠的编制方案通常将事件写入持久化日志(如 Kafka 的磁盘存储),配合 ACK 机制保证投递成功。A 没有中心协调器可依赖;C 会造成重复风暴;D 共享文件系统会引入新的单点。持久化加可靠投递才是正解。

Q9. 关于编排模式的状态管理,下列说法正确的是?

单选题 · mid

  • A.状态分散在各服务的事件日志中
  • B.状态由中心协调器集中保存并可追溯← 正确答案
  • C.服务之间通过共享缓存同步状态
  • D.每个服务保存一份全局状态副本

答案:B。编排模式的工作流引擎会持久化流程实例的当前步骤与上下文,集中管理状态,便于查询恢复。A 是编制模式的特征,C 和 D 都会引入额外的同步复杂性与不一致风险。

Q10. 关于编排与编制的对比,下列说法正确的有哪些?(多选)

多选题 · mid

  • A.编排有中央协调器,掌握全局进度← 正确答案
  • B.编制适合并行事件协作的业务场景← 正确答案
  • C.两种模式完全对立,只能二选一
  • D.生产环境常采用编排加编制的混合模式← 正确答案

答案:ABD。编排有中心协调器,全局进度一目了然;编制事件驱动,适合并行协作。两者并非势不两立,生产中常“核心主流程编排 + 外围事件编制”混合使用。C 的说法过于绝对,不符合真实架构实践。