问题
在单体架构中所有的数据都在一个数据库中,开发者可以使用数据库的事务来保证数据的一致性。当事务执行失败时,可以回滚事务,把数据恢复到修改前的状态。
BEGIN TRAN
-- 你的业务代码
END TRAN
在微服务中,每个服务都有自己的数据库,当一个业务操作需要跨多个服务时,开发者没有像单个数据库那样把业务包装到事务中的简单工具。如果使用分布式事务锁,可能会因为要协调和锁定多个服务,而导致性能急剧下降。
比如在网上购物中,消费者可以使用自己的积分来抵扣订单金额,而系统中有订单服务和积分服务,系统先扣除消费者的积分,然后到订单系统中发货,如果发现缺货则需要恢复消费者的积分。因为是两个服务,所以开发者不能使用事务来解决这个问题。
解决方案
开发者可以使用 SAGA 模式来解决这个问题。SAGA 模式要求每个服务依次完成自己的事务,直到所有的事务都成功完成,则整个操作成功,否则从发生错误的事务开始依次回滚上面一个服务的操作。
这需要每个服务对于介入事务的操作一方面需要一个执行事务的操作,另一方面需要一个回滚事务的操作。
优缺点分析
SAGA 可以让开发者避免分布式锁造成的性能问题,但是由于要加入回滚操作,所以这增加了每个服务业务操作实现的复杂性。
参考链接:
https://microservices.io/patterns/data/saga.html