4.2.1 协同式 Saga
Saga 参与方订阅彼此的事件并做出相应响应.
实现协同式 Create Order Saga
协同例子:
注意图中的事件不像之前的描述 (线性传递), 这里的某些服务产生的事件可能由多个服务订阅.
步骤描述:
无法授权消费者信用卡场景:
步骤:
可靠的事件通信
与服务间通信相关问题:
- 确保 Saga 参与方将更新其本地数据库和发布事件作为数据库事务的一部分 (作为原子)
- 确保 Saga 参与方必须能够将接收到的每个事件映射到自己的数据上
- 相关性 ID
协同式 Saga 的好处和弊端
好处:
弊端:
4.2.2 编排式 Saga
Saga 编排器类, 使用命令/异步响应方式与 Saga 的参与方服务通信.
实现编排式的 Create Order Saga
编排例子:
注意图中的通道所属.
步骤:
注意最后一步, 可以直接更新 Order 来批准订单, 但为了保持一致性, Saga 将 Order Service 视为另一个参与方.
把 Saga 编排器视为一个状态机
状态机由一组状态和一组由事件触发的状态之间的转换组成.
状态机模型:
也就是说每个业务流都创建一个状态机.
每个服务产生的数据可能发给了编排类.
Saga 编排和事务性消息
基于编排的 Saga 的每个步骤都包括一个更新数据库和发布消息的服务.
编排式 Saga 的好处和弊端
好处:
弊端:
建议使用编排式 Saga.