微服务架构什么时候需要回滚逻辑?

问题描述

根据 chrisrichardson 关于在微服务中补偿交易的内容

什么是补偿交易?

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

在 Create Order Saga 中,createOrder() 具有rejectOrder() 补偿事务,因为reserveCredit() 步骤可能会失败。 ReserveCredit() 步骤不需要补偿事务,因为批准订单() 步骤不会失败。而且,批准订单()步骤不需要补偿事务,因为它是传奇的最后一步。

这是否真的意味着一个步骤不需要补偿事务,只要它的后续步骤没有出于业务原因而失败?如果以下步骤由于某些技术原因而失败 - 一些错误或一些微服务间通信问题,例如?

解决方法

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

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