【分布式事务系列】Saga模式实现方式

834 阅读2分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

Saga的实现方式

在一个电商平台的下单场景中,会涉及到订单的创建、商品库存的扣减、钱包支付、积分赠送等操作,整体的时序图如下: image.png

电商平台下单的流程是一个典型的长事务场景,根据Saga模式的定义,先将长事务拆分成多个本地短事务,每个服务的本地事务按照执行顺序逐一提交,一旦其中一个服务的事务出现异常,则采用补偿方式逐一撤回,这个过程的实现涉及到Saga的协调模式,它有两种常用的协调模式。

  1. 事件编排式:把Saga的决策和执行顺序逻辑分布在Saga的每一个参与者中,它们通过交换事件的方式进行沟通。

在基于事件的编排模式中,第一个服务执行完一个本地事务后,发送一个时间,这个事件会被一个或多个服务监听,监听到时间的服务再执行本地事务并发布新事件,伺候一直延续这种事件触发模式,直到业务流程中最后一个服务的本地事务执行结束,相当于整个分布式长事务执行完成。

流程复杂,但是比较常见的解决方案,具体步骤如下:

  • 订单服务创建新的订单,把订单状态设置为待支付,并发布一个order_create_event事件
  • 库存服务监听到order_create_event事件后,执行本地库存冻结方法,如果执行成功,则发布一个order_prepared_event事件
  • 支付服务监听order_prepared_event事件后,执行账户扣款方法,并发布pay_order_event事件。
  • 积分服务监听pay_order_event事件,增加账户积分,并更新订单状态为成功。

如果上述某一个步骤执行失败,会发送一个失败的时间,每个服务需要监听失败情况根据实际需求进行逐一回滚。