在耗时的操作中处理REST API超时

时间:2018-07-25 08:28:32

标签: rest

如何在REST API中处理耗时的操作中的超时。假设我们以以下情形为例:

  1. 客户端服务通过REST API发送请求以插入资源。
  2. 超时已过去。客户认为插入失败。
  3. REST API继续工作并完成插入。
  4. 客户端不通知资源插入,其状态为“失败”。

我可以认为我是一个具有消息代理的解决方案,可以将订单发送到队列并等待其解决。

还有其他解决方法吗?

编辑1:

  • POST-PUT Pattern,如本主题中所建议的。
  • 消息代理(增加了系统的复杂性)
  • Callback or webhook。将请求传递给服务器API可以调用的返回URL,以使客户端知道工作已完成。

2 个答案:

答案 0 :(得分:2)

HTTP提供了set of properties用于调用某些方法。这些主要是safetinessidempotencycacheability。当入门者向客户保证没有数据被修改时,第二方向用户保证是否可以重新发出关于连接问题的请求,并且客户不知道初始请求是否成功并且只有响应中途丢失。 PUT,即确实提供了这样的属性,即

一个简单的POST请求“插入”某些数据不具有任何这些属性。接收到POST请求的服务器还根据其自身的语义来处理有效负载。客户端现在不预先确定是否将创建资源,或者服务器是否只是忽略请求。如果服务器创建了资源,则服务器将通过Location HTTP响应标头通知客户端,该标头指向客户端可以从中检索信息的实际位置。

PUT通常仅用于“更新”资源,尽管根据the spec,它也可以用于创建新资源(如果尚不存在)。与成功创建资源时的POST一样,PUT响应应包含这样的Location HTTP响应标头,以通知客户端已创建资源。

POST-PUT-Creation pattern通过首先向服务器触发POST请求直到接收到包含Location HTTP响应头的响应,从而将URI的创建与表示的实际持久性区分开来。此标头用于PUT请求中,以将有效负载实际发送到服务器。由于PUT是幂等的,因此服务器可以简单地重新发出请求,直到它从服务器收到有效的响应为止。

在向服务器发送初始POST请求时,客户端无法确定请求是否到达服务器并且只有响应丢失或初始请求没有到达服务器。由于该请求仅用于创建新的URI(尚无任何内容),因此客户端可以简单地重新发出该请求,而在最坏的情况下,只需创建一个新的URI,该URI不指向任何内容。服务器可能具有清理例程,该例程会在一定时间后释放未使用的URI。

一旦客户端收到URI,就可以简单地使用PUT将数据可靠地发送到服务器。只要客户端没有收到有效的响应,它就可以一遍又一遍地重新发出请求,直到它收到响应为止。

因此,我认为不需要使用使用代理和队列的面向消息的中间件(MOM)来确保可靠的消息传递。

答案 1 :(得分:0)

您还可以在成功插入之前交换过的request_id或类似类型的内容后缓存数据。但是我相信带有一些异步任务运行程序的消息代理是解决问题的一种更好的方法,尤其是在您的请求线程是一种稀缺资源的情况下。我的意思是。如果您一直都在收到大量请求。那么最好尽快保持您的响应,以便工作人员可以随时处理任何请求。