Web services 调用API时如何处理网络故障

Web services 调用API时如何处理网络故障,web-services,rest,soap,distributed-transactions,Web Services,Rest,Soap,Distributed Transactions,今天,我想到一个简化的场景,如下所示: 我有自己的支付系统,当用户来省钱时,我使用表单将交易数据保存在自己的数据库中。在保存我自己的记录之前,我需要调用银行支付系统,该系统具有类似Web服务API的功能 公共布尔支付(userInfo userInfo,float money) 根据返回的结果,我决定是否保存自己的数据 我的问题是,在调用银行支付API后,我自己的网络是否关闭,并且没有返回结果。如何确定是否需要保存自己的表单记录。也许银行支付系统已经处理了这笔交易?如何使两部分数据同步 我们无法

今天,我想到一个简化的场景,如下所示:

我有自己的支付系统,当用户来省钱时,我使用表单将交易数据保存在自己的数据库中。在保存我自己的记录之前,我需要调用银行支付系统,该系统具有类似Web服务API的功能

公共布尔支付(userInfo userInfo,float money)

根据返回的结果,我决定是否保存自己的数据

我的问题是,在调用银行支付API后,我自己的网络是否关闭,并且没有返回结果。如何确定是否需要保存自己的表单记录。也许银行支付系统已经处理了这笔交易?如何使两部分数据同步


我们无法更改银行支付API,因为银行规范是固定的。Webservice API是SOAP或Restful

您的实现可能是这样的:

  • 始终将事务数据保存到数据库中,并将其标记为“未处理”

  • 使用单独的“worker”进程,从数据库中获取所有未处理的事务,并调用银行支付系统的
    pay
    方法

  • 根据
    支付
    方法结果,选择更改/不更改交易状态

Worker可能通过一个计划的进程(每XX秒/分钟/等)或一些不断查询未处理事务的服务(可能在循环之间有一定的延迟)执行


因此,在银行支付系统“无结果”的情况下,交易状态将不会更改,并且在下一次工作运行时将重试“支付”方法。

您的实现可能如下所示:

  • 始终将事务数据保存到数据库中,并将其标记为“未处理”

  • 使用单独的“worker”进程,从数据库中获取所有未处理的事务,并调用银行支付系统的
    pay
    方法

  • 根据
    支付
    方法结果,选择更改/不更改交易状态

Worker可能通过一个计划的进程(每XX秒/分钟/等)或一些不断查询未处理事务的服务(可能在循环之间有一定的延迟)执行

所以,在银行支付系统“无结果”的情况下,事务状态将不会更改,并且将在下一次工作运行时重试“支付”方法