Skip to content

事件驱动工作流 = Choreography vs Orchestration ​

解决什么问题:跨多微服务的业务流程如何协调—— Choreography 隐式协调,Orchestration 显式协调,选择决定可维护性。

业务问题 ​

真实场景 ​

场景 1:电商下单工作流

业务流程:下单 → 扣库存 → 收款 → 发货 → 通知

方案 A:Choreography(事件驱动 + 无中心)
  OrderService 下单 → 发 OrderCreated 事件
    ↓
  InventoryService 监听 → 扣库存 → 发 InventoryReserved
    ↓
  PaymentService 监听 → 收款 → 发 PaymentCompleted
    ↓
  ShippingService 监听 → 发货 → 发 OrderShipped
    ↓
  NotificationService 监听 → 通知
  
方案 B:Orchestration(中央协调器)
  OrderOrchestrator 接收下单请求
    → 调 InventoryService 扣库存
    → 调 PaymentService 收款
    → 调 ShippingService 发货
    → 调 NotificationService 通知

Bellemare Ch 8 原话:

"The Choreography Pattern... Microservices react to their input events as they arrive, without any blocking or waiting, in a manner fully independent from any upstream producers or subsequent downstream consumers."

失败模式 ​

失败模式后果
选错模式工作流难维护或难追踪
混合用行为不一致、难调试
无关联 ID无法追踪

控制论视角 ​

Ch 21:"多级分散系统的协调" + Ch 4 §4.6:"反馈环路"

Choreography = 多级分散(无中心)
  - 各服务独立反应(反馈环路短)
  - 协调是涌现行为
  
Orchestration = 中心协调(控制器)
  - 一个中央控制器协调
  - 协调逻辑集中(可观测)

对位:

  • Choreography = 分布式控制律(每服务一个控制律)
  • Orchestrator = 中央控制律(一个服务协调全局)
  • Saga = 长链路反馈控制

核心概念 ​

Choreography 详解 ​

特征:
  - 服务间无直接调用
  - 通过事件流通信
  - 工作流是"涌现行为"
  
优点:
  - 松耦合
  - 易添加/删除服务
  - 故障隔离
  - 高伸缩性
  
缺点:
  - 工作流难追踪(无中心)
  - 中间插入步骤难
  - 顺序修改困难
  - 业务逻辑分散

Orchestration 详解 ​

特征:
  - 中央 Orchestrator 服务
  - 显式调用其他服务
  - 显式工作流逻辑
  - 显式补偿逻辑
  
优点:
  - 工作流清晰可见
  - 易于修改
  - 易于追踪
  - 业务逻辑集中
  
缺点:
  - Orchestrator 是单点
  - 紧耦合到 Orchestrator
  - 难演化
  - 协调器容易膨胀

决策矩阵 ​

维度ChoreographyOrchestration
工作流复杂度低高
修改频率低高
团队数量多少
故障容忍高中
可观测性低高
伸缩性高中
调试难度高低

Saga 模式(两者的混合) ​

Saga = 多步 + 补偿

类型:
  - Orchestrated Saga:中央协调器
  - Choreographed Saga:事件驱动协调
  
例:下单 Saga
  Step 1: 创建订单(OrderService)
  Step 2: 扣库存(InventoryService)
  Step 3: 收款(PaymentService)
  Step 4: 发货(ShippingService)
  
任一步失败 → 补偿已完成的步骤
  Step 1 失败 → 取消订单
  Step 2 失败 → 取消订单 + 释放库存(如果已扣)
  Step 3 失败 → 退款 + 取消订单 + 释放库存

工程实践 ​

决策树 ​

决策:
  1. 工作流步骤数 > 5?
     - 是 → Orchestration 更可管理
     - 否 → Choreography 即可
  2. 业务逻辑变更频繁?
     - 是 → Orchestration(业务集中)
     - 否 → 两者都可
  3. 团队规模 > 10?
     - 是 → Choreography(自治)
     - 否 → Orchestration(效率)
  4. 故障容忍要求高?
     - 是 → Choreography(无中心)
     - 否 → 两者都可

实战 1:监控 Choreography 工作流 ​

方法:
  - 关联 ID(贯穿所有事件)
  - 分布式追踪(OpenTelemetry)
  - 状态机建模
  - 工作流完成检测(超时 + 完成标志)

实战 2:Orchestrator 实现 ​

python
class OrderOrchestrator:
    def execute(self, order):
        try:
            # 步骤 1:扣库存
            self.inventory_service.reserve(order)
            # 步骤 2:收款
            self.payment_service.charge(order)
            # 步骤 3:发货
            self.shipping_service.ship(order)
            # 步骤 4:通知
            self.notification_service.send(order)
        except InsufficientStock:
            self.compensate_inventory(order)
            raise
        except PaymentFailed:
            self.compensate_payment(order)
            self.compensate_inventory(order)
            raise
        # ...

反模式 vs 正模式 ​

反模式正模式
Orchestrator 调用所有步骤(含业务逻辑)Orchestrator 只协调,业务逻辑在服务
Choreography 但有强顺序要求用事件顺序或 Saga
混合 Choreography + Orchestration明确选一种
无关联 ID强制关联 ID

性能指标 ​

指标衡量健康值
工作流完成率成功完成的工作流比例> 99%
平均完成时间工作流耗时业务决定
可追踪工作流比例可端到端追踪的工作流> 95%
补偿成功率Saga 补偿成功比例> 99%

边界判断 ​

何时用 Choreography(默认) ​

  • 简单工作流(< 5 步)
  • 步骤独立
  • 高伸缩性需求
  • 故障容忍重要

何时用 Orchestration ​

  • 复杂工作流(> 5 步)
  • 业务逻辑复杂
  • 频繁修改
  • 需要集中监控

何时用 Saga ​

  • 跨服务事务
  • 需要补偿
  • 业务一致性要求

关键洞察 ​

  1. 选择决定可维护性——不是技术对错,是运维体验。
  2. Choreography + 关联 ID = 可追踪——没有 ID 就没救。
  3. Orchestrator 是状态机——避免变成"上帝服务"。
  4. Saga 是分布式事务的标准答案——比 2PC 简单 100 倍。
  5. 与 cybernetics 同构——Ch 21 多级分散协调 = Choreography;Ch 4 §4.6 中央反馈 = Orchestration。

从名家方法论与工程化思路中蒸馏出自己的工程体系。