image.png

4.2.1 协同式 Saga

Saga 参与方订阅彼此的事件并做出相应响应.

实现协同式 Create Order Saga

协同例子:

image.png

注意图中的事件不像之前的描述 (线性传递), 这里的某些服务产生的事件可能由多个服务订阅.

步骤描述:

image.png
image.png

无法授权消费者信用卡场景:

image.png

步骤:

image.png
image.png
image.png

可靠的事件通信

与服务间通信相关问题:

  • 确保 Saga 参与方将更新其本地数据库和发布事件作为数据库事务的一部分 (作为原子)
  • 确保 Saga 参与方必须能够将接收到的每个事件映射到自己的数据上
    • 相关性 ID

协同式 Saga 的好处和弊端

好处:

image.png

弊端:

image.png
image.png

4.2.2 编排式 Saga

Saga 编排器类, 使用命令/异步响应方式与 Saga 的参与方服务通信.

实现编排式的 Create Order Saga

编排例子:

image.png

注意图中的通道所属.

步骤:

image.png

注意最后一步, 可以直接更新 Order 来批准订单, 但为了保持一致性, Saga 将 Order Service 视为另一个参与方.

把 Saga 编排器视为一个状态机

状态机由一组状态和一组由事件触发的状态之间的转换组成.

状态机模型:

image.png

也就是说每个业务流都创建一个状态机.

每个服务产生的数据可能发给了编排类.

Saga 编排和事务性消息

基于编排的 Saga 的每个步骤都包括一个更新数据库和发布消息的服务.

编排式 Saga 的好处和弊端

好处:

image.png

弊端:

image.png

建议使用编排式 Saga.