当前位置: 首页 > 知识库问答 >
问题:

如果发生任何失败,佐贺模式是否能够帮助扭转支出?

林昱
2023-03-14

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

无论我看到什么样的例子,它们大多都像订单服务-

但是,我的问题是:我有这样一个相反的场景:支付服务-

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

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

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

共有1个答案

仲和韵
2023-03-14

saga模式允许您协调多个操作,以防其中一个步骤出现故障,它允许您协调步骤以反转到目前为止所做的事情,因此您可以在没有实际事务的情况下以使所有步骤事务性的方式查看它。

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

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

更新:根据评论添加额外信息

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

此外,请注意,由saga执行的步骤可能有瞬时故障或不可恢复/永久故障。暂时性故障可以重试,很可能会成功。通过重试,永久性失败不会成功。

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

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

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

 类似资料:
  • 我正在尝试安装节点帮助模块,但经过多次尝试,我不断得到以下错误。node-help包的安装是否已中断? /usr/local/lib/node_modules/node-help/bin/node-help:6 const{homedir}=require('os');^ SyntaxError:意外标记{at exports.runinthiscontext(VM.js:53:16)at mod

  • 在我看来,传奇模式在很多方面都是聚合模式的倒置。首先将命令处理成域事件,然后在聚合的情况下将此域事件应用到状态中是很有用的,但我认为在saga的情况下,域事件是已经发生的事情的文档,应该在试图对状态做出反应之前应用到状态中。 现在我的问题是:对于模块,有没有一种方法可以将命令配置为首先,然后?或者这是一个严重的bug,需要在一般情况下进行修复?

  • 社区帮助 社区帮助是 adobe.com/cn 上的一个集成环境,允许您访问由 Adobe 和行业专家主持的社区生成的内容。用户的注释可帮助您找到答案。搜索 “社区帮助 ”,查找 Web 上关于 Adobe 产品和技术的最佳内容,包含以下资源: 视频、教程、提示和技巧、博客、文章及设计和开发人员的示例。 完整的联机帮助。此联机帮助会定期更新且比随产品提供的 “帮助 ”更完整。访问帮助时,如果连接到

  • 安全模式 此预发行版本中引入了一项新功能,允许您在出现错误而无法启动 Illustrator 时,从这些错误中恢复。 倘若遇到导致 Illustrator 在启动时崩溃的情况。例如,字体损坏、增效工具错误或首选项文件损坏。如果启动失败,则在下次尝试启动时,可以选择以“安全模式”启动 Illustrator。Illustrator 启动时将检查是否存在任何导致错误的文件。以“安全模式”启动 Illu

  • 我想检查一下字符串是否能够转换为float或int。 例如: 我收到 此值可以通过以下方式转换为float 但如果我收到 我的应用程序会崩溃。那么我如何检查我收到的字符串是否能够转换成浮点呢? 对于Int,我如何做到这一点?

  • 我们很乐意帮助您让您的用例可以用 linkerd 工作,并且我们对您的反馈很感兴趣! 如果您遇到问题或认为您发现bug,请先查看 常见问题。如果您仍然需要帮助,您可以通过几种方式与我们联系: 在 linkerd Discourse instance 提出有关配置或故障排除的问题。 在 github issues中提交bug或功能请求。 在我们的 linkerd public Slack 中聊天。