Microservices 在微服务体系结构中何时需要回滚逻辑?

Microservices 在微服务体系结构中何时需要回滚逻辑?,microservices,distributed-transactions,saga,Microservices,Distributed Transactions,Saga,根据microservices中sagas中关于补偿事务的描述: 什么是补偿交易 rejectOrder()命令是补偿事务的一个示例。与ACID事务不同,sagas无法自动撤消前面步骤所做的更改,因为这些更改已经提交。相反,您必须编写明确撤消这些更改的补偿事务一个传奇故事中的每一个步骤之后都有一个可能失败的步骤(出于业务原因),必须有一个相应的补偿事务。 在createOrder传奇中,createOrder()具有rejectOrder()补偿事务,因为reserveCredit()步骤可能失

根据microservices中sagas中关于补偿事务的描述:

什么是补偿交易

rejectOrder()命令是补偿事务的一个示例。与ACID事务不同,sagas无法自动撤消前面步骤所做的更改,因为这些更改已经提交。相反,您必须编写明确撤消这些更改的补偿事务一个传奇故事中的每一个步骤之后都有一个可能失败的步骤(出于业务原因),必须有一个相应的补偿事务。

在createOrder传奇中,createOrder()具有rejectOrder()补偿事务,因为reserveCredit()步骤可能失败。reserveCredit()步骤不需要补偿事务,因为approveOrder()步骤不能失败。而且,approveOrder()步骤不需要补偿事务,因为这是传奇的最后一步


这是否意味着一个步骤不需要补偿事务,只要它的下一个步骤没有因为业务原因而失败?如果以下步骤因某些技术原因而失败,该怎么办?

这是因为,如果不存在业务错误,您可以重试通信或在技术问题解决后安排通信,并且当发生时,状态将是正确的


请记住,技术问题是暂时的,在微服务体系结构中,您必须处理最终的一致性

如果您希望在任何步骤中出现任何故障,您应该将其包装到事务中,这将在将来节省您的时间。不要看是否是因为业务逻辑或技术问题当存在网络通信时,这不是一个选项,因为如果出现故障,服务无法回滚,因为它不会发生在数据库事务中,如果网络通信改变了其他微服务中的状态,其他调用失败第一个调用无法回滚