在我的应用程序的后端,有一个路径,首先处理付款,然后写入到我的MongoDB中的集合。
await call_payment_vendor_api(); // system fails here await write_to_collection();
现在系统中出现了不一致的情况,我该如何恢复呢?
kupeojn61#
跨系统的事务通常有点棘手,有多种方法可以处理,但没有银,这就是为什么许多所谓的微服务系统最终成为分布式的整体。如果您处于同步环境中(即需要立即响应Web请求),最直接的方法是:尝试/捕获MongoDB中的异常,如果失败,则退款。为了获得更好的用户体验,我会尝试将写入操作放入后台作业队列,该队列处理待处理的更新,可能会在放弃和退款之前重试几次。或者可能会升级到技术支持,技术支持可以查看一下,并通过后台管理UI修复问题。但同样,在Web请求的情况下,您可能必须轮询作业状态以更新网站或重新设计整个流程。另一种可能性:在MongoDB中,创建一个交易,首先写入你的数据,然后调用支付提供商。如果他们确认,你只需要提交交易,这(通常)是不太可能失败的。
tcbh2hod2#
我有两个办法解决这个问题。1.第一种方法是在代码中创建一个异常处理来保存错误历史,然后你可以创建一个自动函数来对数据库中的特定数据执行write_to_collection()。
write_to_collection()
try { await call_payment_vendor_api(); // system fails here await write_to_collection(); } catch(err) { await save_error_history_to_database(); }
1.第二种方法是确保您的供应商API具有冲销付款流程。您可以通过调用冲销API将资金返回给特定客户。
js4nwp543#
我的解决方案是,如果您的后端启动,您可以检查支付供应商API中是否有任何已经支付但尚未被应用程序处理的付款。另一种方法是在多个主机上拥有多个示例(例如负载平衡),以确保一个示例保持运行。
3条答案
按热度按时间kupeojn61#
跨系统的事务通常有点棘手,有多种方法可以处理,但没有银,这就是为什么许多所谓的微服务系统最终成为分布式的整体。
如果您处于同步环境中(即需要立即响应Web请求),最直接的方法是:尝试/捕获MongoDB中的异常,如果失败,则退款。
为了获得更好的用户体验,我会尝试将写入操作放入后台作业队列,该队列处理待处理的更新,可能会在放弃和退款之前重试几次。或者可能会升级到技术支持,技术支持可以查看一下,并通过后台管理UI修复问题。但同样,在Web请求的情况下,您可能必须轮询作业状态以更新网站或重新设计整个流程。
另一种可能性:在MongoDB中,创建一个交易,首先写入你的数据,然后调用支付提供商。如果他们确认,你只需要提交交易,这(通常)是不太可能失败的。
tcbh2hod2#
我有两个办法解决这个问题。
1.第一种方法是在代码中创建一个异常处理来保存错误历史,然后你可以创建一个自动函数来对数据库中的特定数据执行
write_to_collection()
。1.第二种方法是确保您的供应商API具有冲销付款流程。您可以通过调用冲销API将资金返回给特定客户。
js4nwp543#
我的解决方案是,如果您的后端启动,您可以检查支付供应商API中是否有任何已经支付但尚未被应用程序处理的付款。
另一种方法是在多个主机上拥有多个示例(例如负载平衡),以确保一个示例保持运行。