在 RESTful 网络服务中,服务器需要很长时间才能响应是否可以接受?

In a RESTful web service, is it acceptable for the server to take many minutes to respond?

我正在使用 flask-restful 开发 RESTful 网络服务。

客户端需要能够请求服务器执行的作业。这项工作可能需要大约 1 秒到大约 1 小时的时间来执行。一般预计需要1-5分钟。

作业完成后,客户端需要下载 JSON 转储。大小从 100KB 到 100MB 不等。

我看到 2 个选项:

  1. 客户端以POST请求的形式提交作业,只有在作业完成时才会收到来自服务器的响应。响应包括 JSON 转储。
  2. 客户端将作业作为 POST 请求提交,服务器立即响应 200 OK。然后客户端每隔 60 秒提交一次 GET 状态请求。作业完成后,它会提交另一个 GET 请求以下载 JSON 转储。

根据 REST 原则,首选哪个选项?

我看到选项 1 的问题是在等待响应时网络可能中断。

等待超过几秒是绝对no-no

大多数 Web 基础设施并不是为处理如此长的延迟而设计的,一些 proxies/load 平衡器可能会超时 - 即使您的服务器最终产生了响应,no-one 也会在那里读取它.而且,用户会感到无聊并开始refreshing/cancelling/whatever。

正如@jonrsharpe 在评论中提到的,您的服务器应尽快响应有关正在发生的事情的信息。输入202 Accepted状态码:

The request has been accepted for processing, but the processing has not been completed. The request might or might not eventually be acted upon, as it might be disallowed when processing actually takes place. There is no facility for re-sending a status code from an asynchronous operation such as this.

(摘自restapitutorial

所以用 202 和结果应该在的位置的句柄来响应 - 在 body 中或在响应中 headers。然后客户端可以轮询给定位置以查看作业状态并下载结果。

如果结果很大,允许对结果进行HEAD请求也是合理的,这样用户可以轮询HEAD来检查结果是否可用,然后用GET,没有在轮询的时候突然被淹没。