处理并发重复请求

时间:2019-05-16 18:29:06

标签: rest api http

我有一个称为CancelOrder的REST端点。它包括四个步骤(依次):

  1. 取消履行(呼叫下游服务)。
  2. 取消报价(调用下游服务)。
  3. 将订单状态更新为cancelled(在我们的本地数据库中)。

这是一个PUT操作,因此,我试图使其成为幂等且具有故障保护功能。

方案1:

  1. 只需一个电话

    取消实现,取消报价,更新状态。很好。

  2. 收到其他呼叫时,呼叫正在中途。假设不存在悲观锁定

    订单状态尚未通过上一次调用更改为“已取消”,但已取消履行。现在,当第二个调用尝试取消实现时,它将返回一个错误。

处理上述情况的理想方法是通过在每次调用时获取文档上的写锁来使API具有事务性。但是我不想那样做。

我应该如何处理这种情况?

1 个答案:

答案 0 :(得分:1)

有两种方法(在许多其他解决方案中)来处理这种情况:

解决方案A:

  1. isCanceling的顺序添加新状态。服务器收到订单的第一个取消请求后,将此状态设置为true。取消操作完成后,将此状态设置为false
  2. 如果服务器收到相同顺序的另一个取消请求,但发现其状态为isCanceling,则服务器将102 Processing返回给客户端,表明操作正在进行中。

解决方案B:

  1. 与解决方案A中的步骤1相同。
  2. 服务器每次收到取消请求(包括第一个请求)时,都会在该订单的队列中添加一个侦听器,等待事件“ Cancel-OK”或“ Cancel-Fail”通知。
  3. 如果服务器收到订单的取消请求,但发现其状态为isCanceling,则服务器将不执行任何操作,只需要在上述队列中添加相应的侦听器即可。
  4. 取消操作完成(成功或失败)后,将触发一个事件。队列中的所有侦听器都将收到消息,并且将为所有先前的未决HTTP请求返回HTTP响应。

我个人更喜欢解决方案B。