- 1)使用付款服务提供商授权付款
- 2)从库存中保留商品
- 3.1)使用付款服务提供商捕获付款
- 3.2)订购该商品
- 4)发送电子邮件通知,接受有收据的订单
- 该商品已无库存
- 付款信息不正确
- 付款人使用的帐户没有可用资金
- 外部调用(例如对于付款服务提供商)失败,例如停机时间
您如何处理出现的问题?您将如何通知前端关于失败的情况?
补偿性事务的思想是,每个阴影都有其阳影:如果您有一个可以下订单的事务,那么您可以使用一个取消该订单的事务来撤销它。这后者的事务称为补偿性事务。因此,如果您执行了一些成功的事务,然后其中一个失败了,您可以追溯您的步骤并补偿您所做的每个成功事务,并因此撤消它们的副作用。
我特别喜欢REST from Research to Practice这本书中的一章。第23章(面向RESTful服务的分布式原子事务)深入解释了尝试/取消/确认模式。
一般来说,它意味着当您执行一组交易时,它们的副作用在事务协调器得到确认它们全部成功之前不会生效。例如,如果您在 Expedia 上预订机票,您的飞行有两段路程且由不同的航空公司运营,则一个事务将预订美国航空的航班,另一个事务将预订联合航空的航班。如果您的第二个预订失败,则您想要赔偿第一个预订。但不仅如此,您还想避免在确认两者之前第一个预订生效。因此,最初的事务进行了预订但保留了其副作用 "待确认"。第二个预订也是如此。一旦事务协调器知道所有内容都已预订,它可以向所有方发送确认消息,以便他们确认他们的预订。如果在合理的时间窗口内没有确认预订,则受影响的系统会自动撤销预订。将错误视为替代流程
正如我在答案开头提到的,不是所有的事情都是错误。有些事情只是替代流程。
在那些涉及服务间通信(计算机之间的交互)的情况下,当工作流中的某个步骤失败时,您不一定需要撤消之前所做的一切。您可以将错误视为工作流的一部分。分类可能导致错误的原因,并将其作为另一种事件流进行记录,这只需要人工干预即可。这只是完整编排中需要人员介入进行决策、解决数据不一致或批准继续前进的另一步骤。
例如,当您处理订单时,由于资金不足,支付服务失败。因此,撤消其他所有操作没有意义。我们只需要将订单放置在系统中的某个问题解决者可以处理的状态下,一旦修复,就可以继续进行其余的工作流程。
事务和数据模型状态至关重要
我发现这种类型的事务性工作流需要对模型必须经过的不同状态进行良好的设计。就像尝试/取消/确认模式的情况一样,这意味着最初应用副作用,而不一定使数据模型对用户可用。
例如,当您下订单时,可能会将其添加到“待处理”状态的数据库中,这不会出现在仓库系统的用户界面中。一旦确认付款,订单将出现在用户界面中,以便用户最终可以处理其发货。
在设计事务粒度时,难点在于如何使系统保持有效状态,即使您的事务工作流程中的一步失败,只要故障原因得到纠正,就可以恢复。分布式事务工作流程设计
因此,正如您所看到的,设计以这种方式工作的分布式系统比单独调用分布式事务服务要复杂得多。现在,每个服务调用可能因多种原因而失败,并使您的分布式工作流处于不一致状态。重试事务可能并不总是解决问题。您的数据需要像状态机一样建模,这样副作用才会应用但在整个编排成功之前不会确认。
这就是为什么整个过程可能需要以与单片客户端-服务器应用程序通常不同的方式进行设计。当解决冲突时,您的用户现在可能是设计解决方案的一部分,并考虑到事务编排可能需要几个小时甚至几天才能完成,具体取决于它们如何解决冲突。
正如我最初所说,这个主题太广泛了,需要更具体的问题来讨论,也许只需要详细讨论其中一两个方面。
无论如何,我希望这在某种程度上能帮助您进行调查。