Saga分布式事务
一、简介 与分布式事务TCC一样,目的都是为了在各个服务中正常使用事务。和TCC相比,Saga没有“预留”动作,操作都是直接提交到库。其中: 每个Saga由一系列sub-transaction Ti 组成 每个Ti 都有对应的补偿动作Ci,补偿动作用于撤销Ti造成的结果 既然Saga的操作都是直接提交到库中,那么当后续的服务操作失败时,我们需要一种方法将已被改变的值更改为之前的状态。 为此Saga定义了两种恢复策略: backward recovery:向后恢复,补偿所有已完成的事务,如果任一子事务失败,则撤销掉之前所有成功的sub-transation,使得整个Saga的执行结果撤销。 forward recovery:向前恢复,重试失败的事务,假设每个子事务最终都会成功。适用于必须要成功的场景,此处不需要补偿事务。 显然,向前恢复没有必要提供补偿事务,如果你的业务中,子事务(最终)总会成功,或补偿事务难以定义或不可能,向前恢复更符合你的需求。 注意事项: 对于服务来说,实现Saga有以下这些要求: Ti和Ci是幂等的。假设在执行Ti的时候超时了,如果采用重传策略则会再次发送Ti,那么就有可能出现Ti被执行了两次,所以要求Ti幂等。而如果Ci也超时了,就会尝试再次发送Ci,那么就有可能出现Ci被执行两次,所以要求Ci幂等。 Ci必须是能够成功的,如果无法成功则需要人工介入