如果发生任何失败,传奇模式是否能够帮助逆转赔付



我对佐贺模式很陌生。我明白,在佐贺的帮助下,如果发生任何失败,我们都可以扭转局面。

无论我看到的例子是什么,它们大多像订单服务->支付服务->其他服务,在支付服务中,资金从客户流向商户,该支付交易可以反向,因为这里的资金从商户流向客户(在反向失败过程中(

但是,我的查询是:我有一个类似的反向场景:支付服务->客户服务

支付服务中,资金从商户流向客户

如果客户服务出现任何故障,我们是否可以使用Saga逆转支付交易?(即,将资金从客户转回商户,以防发生任何故障(

以上可能使用佐贺吗?希望我的问题很清楚。如果有人能在上面帮助我,我会很高兴的。

saga模式允许您协调多个操作,如果其中一个步骤出现故障,它允许您协调步骤以逆转迄今为止所做的工作,因此您可以在不进行实际事务的情况下使所有步骤成为transactional

但sagas无法改变你所做的每一步的性质。向客户收费是我们可以逆转的操作,因为我们可以采取补偿行动,比如将资金退还给客户。向客户付款是一种我们无法逆转的操作,因为一旦钱在客户手中,我们就无法收回。因此,传奇故事可以帮助你确保所有的步骤都发生了,或者确保什么都没有发生,但它不会让你逆转无法逆转的事情。

在这种情况下,您可以做的是保留最终无法逆转的操作。例如,对客户钱包中的钱进行折扣(这是对您拥有的数据库的操作(,然后进行实际支付。如果支付失败,传奇故事将允许你从客户的钱包中扣除,这样就不会造成"损害"。


更新:根据注释添加的额外信息

传奇(通常(是通过消息传递实现的。传奇故事是一个管弦乐队,它并没有真正完成实际的步骤。相反,它发送命令,以便其他进程执行这些步骤,并接收带有操作结果的消息或事件。

此外,请注意,传奇执行的步骤可能会出现短暂故障或不可恢复/永久故障。暂时性故障可以重试,而且很可能会成功。永久性故障不会通过重试成功。

考虑到这一切,我将按如下方式解决问题:

  1. 发送一个命令来更新数据库并存储正在发生的事务。这会锁定资金,因此,即使还没有支付,你也不能再发起一次,最终支付太多钱。这里的故障可能是暂时的(数据库不可用(,也可能是永久的(资金不足(。您可以重试暂时性故障,直到它工作,并通知永久性故障。将操作结果发送回传奇
  2. 如果步骤1成功,则发送命令以执行支付。瞬态故障:外部服务不可用。最多重试X次。永久:支出数据无效。如果无法支付,传奇故事将补偿步骤1,并释放钱包中的资金。向传奇发回一条消息,结果是:要么失败,要么来自外部HTTP服务的响应
  3. 如果支付失败,则发送命令以回滚步骤1。如果成功,发送一个命令以确认支付并将响应存储在DB中。请注意,在这里,更新数据库时不应该出现永久性故障。最多,您可能会出现暂时性故障(数据库不可用(,但重试应该能够最终更新数据库。如果多次重试后操作仍无法成功。您需要手动干预并解决问题,因为您无法回滚步骤2。您应该对流程进行建模,使这一步骤可靠(验证和其他可能导致永久失败的事情应该在步骤1或2中捕获(

我希望这是有道理的。您需要确保覆盖所有场景,并且即使操作失败,也可以可靠地发送消息。

最新更新