问题描述
根据 chrisrichardson 关于在微服务中补偿交易的内容:
什么是补偿交易?
rejectOrder() 命令是补偿交易的一个例子。与 ACID 事务不同,sagas 不能自动撤消先前步骤所做的更改,因为这些更改已经提交。相反,您必须编写显式撤消这些更改的补偿事务。 传奇中的每个步骤都必须有一个可能失败的步骤(出于业务原因)。
在 Create Order Saga 中,createOrder() 具有rejectOrder() 补偿事务,因为reserveCredit() 步骤可能会失败。 ReserveCredit() 步骤不需要补偿事务,因为批准订单() 步骤不会失败。而且,批准订单()步骤不需要补偿事务,因为它是传奇的最后一步。
这是否真的意味着一个步骤不需要补偿事务,只要它的后续步骤没有出于业务原因而失败?如果以下步骤由于某些技术原因而失败 - 一些错误或一些微服务间通信问题,例如?
解决方法
这是因为,如果不能出现业务错误,您可以在技术问题解决后重试通信或安排通信,当它发生时状态将是正确的。
请记住,技术问题是暂时的,在微服务架构中,您必须处理最终的一致性