3Building Microservices(第2版)

工作流

跨服务协作

编排编舞Saga模式分布式事务

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第3章:工作流(Workflows)

一、导读

1.1 本章学习目标

第3章讲解微服务之间的协作模式——如何在分布式环境中实现跨服务的业务流程。

1.2 为什么第三章如此重要

微服务之间的协作是微服务架构中最复杂的部分。分布式事务、数据一致性、故障恢复,都是需要仔细设计的问题。

1.3 核心问题引导

编排和编舞有什么区别?

Saga 模式如何解决分布式事务?

如何处理跨服务的数据一致性?

工作流失败时如何恢复?


二、核心概念详解

3.1 编排 vs 编舞

编排(Orchestration):
- 中心协调器控制整个流程
- 协调器调用各个服务
- 适合复杂流程

编舞(Choreography):
- 没有中心协调器
- 服务之间通过事件通信
- 每个服务独立决策
- 适合简单流程

3.2 Saga 模式

Saga 将分布式事务分解为一系列本地事务,每个本地事务都有对应的补偿操作:

订单 Saga:
1. 创建订单 → 补偿:取消订单
2. 预留库存 → 补偿:释放库存
3. 处理支付 → 补偿:退款
4. 确认订单 → 补偿:无

如果第3步失败:
- 执行补偿:释放库存、取消订单

3.3 事件驱动工作流

java
// 事件定义
public class OrderCreated {
    String orderId;
    String userId;
    List<OrderItem> items;
}

// 事件处理
public class InventoryService {
    @EventListener
    public void onOrderCreated(OrderCreated event) {
        boolean reserved = reserveStock(event.items());
        if (reserved) {
            eventBus.publish(new StockReserved(event.orderId()));
        } else {
            eventBus.publish(new StockReservationFailed(
                event.orderId(), "Out of stock"));
        }
    }
}

三、实战案例

3.1 订单流程

编排模式:
OrderOrchestrator
  ├── createOrder()
  ├── reserveStock()
  ├── processPayment()
  └── confirmOrder()

编舞模式:
OrderService → 发布 OrderCreated
  → InventoryService → 发布 StockReserved
    → PaymentService → 发布 PaymentProcessed
      → OrderService → 发布 OrderConfirmed

四、本章小结

微服务之间的协作需要仔细设计。编排适合复杂流程,编舞适合简单流程。Saga 模式通过补偿机制解决分布式事务。


五、思考与练习

编排和编舞如何选择?

Saga 模式有什么局限性?

如何处理 Saga 中的并发问题?

事件驱动架构如何保证消息不丢失?

如何监控和调试工作流?


3/8工作流
0%