微服务架构(MSA)已经变得非常流行。但是,一个常见问题是如何跨多个微服务管理分布式事务。当微服务架构将单体系统分解为自封装服务时,意味着单体系统中的本地事务现在分布到将按顺序调用的多个服务中。

说到分布式事务,通常熟悉的是两阶段提交,TCC等常见模式。 除此之外还有基于Saga实现的分布式事务。

什么是Saga?

Saga事务模型又叫做长时间运行的事务(Long-running-transaction), 它是由普林斯顿大学的H.Garcia-Molina等人提出,它描述的是另外一种在没有两阶段提交的的情况下解决分布式系统中复杂的业务事务问题。

Saga事务是一个长事务,整个事务可以由多个本地事务组成,每个本地事务有相应的执行模块和补偿模块,当Saga事务中任意一个事务出错了,可以调用相关事务进行对应的补偿恢复,达到事务的最终一致性。

它与2PC不同,2PC是同步的,而Saga模式是异步和反应性的。在Saga模式中,分布式事务由所有相关微服务上的异步本地事务完成。微服务通过事件总线相互通信。

Saga调用

下面是以客户订单为例的Saga模式图:

在这里插入图片描述

在上面的示例中,OrderMicroservice接收下订单的请求。它首先启动本地事务以创建订单,然后发出OrderCreated事件。CustomerMicroservice接收此事件后,将处理事件并更新客户资金。如果从账户成功扣除,CustomerFundUpdated则会发出一个事件,在此示例中表示交易结束。

如果有某个微服务无法完成其本地事务,则其他微服务将运行补偿事务以回滚更改。以下是补偿交易的Saga模式图:

在这里插入图片描述

在上面的例子中,UpdateCustomerFund由于某种原因失败了,然后它发出了一个CustomerFundUpdateFailed事件。在OrderMicroservice监听到该事件并启动其补偿事务恢复所创建的订单。

Saga模式的优点

Saga模式的一大优势是它支持长事务。因为每个微服务仅关注其自己的本地原子事务,所以如果微服务运行很长时间,则不会阻止其他微服务。这也允许事务继续等待用户输入。此外,由于所有本地事务都是并行发生的,因此任何对象都没有锁定。

Saga模式的缺点

Saga模式很难调试,特别是涉及许多微服务时。此外,如果系统变得复杂,事件消息可能变得难以维护。Saga模式的另一个缺点是它没有读取隔离。例如,客户可以看到正在创建的订单,但在下一秒,订单将因补偿交易而被删除。

为了解决Saga模式的复杂性问题,将流程管理器添加为协调器是很正常的。流程管理器负责监听事件和触发端点。

结论

Saga模式是解决基于微服务的体系结构的分布式事务问题的优选方式。但是,它还引入了一些新的问题,例如如何以原子方式更新数据库并发出事件。采用Saga模式需要改变开发和测试的思维方式。对于不熟悉这种模式的团队来说,这可能是一个挑战。有许多Saga模式变体可以简化其实现。因此,为项目实施选择适当的方式是很重要的。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐