Skip to main content
 首页 » 编程设计

python之在 RESTful Web 服务中,服务器需要很长时间才能响应是否可以接受

2025年05月04日49thcjp

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

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

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

我看到 2 个选项:

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

在 REST 原则下哪个选项是首选?

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

请您参考如下方法:

等待超过几秒钟是绝对不能的。

大多数 Web 基础设施并不是为处理如此长的延迟而设计的,一些代理/负载平衡器可能会超时 - 即使您的服务器最终产生了响应,也没有人会在那里阅读它。此外,用户会感到无聊并开始刷新/取消/等等。

正如@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 和一个句柄来响应结果应该在什么地方——无论是在正文中还是在响应头中。然后客户端可以轮询给定位置以查看作业状态并下载结果。

如果结果很大,允许对结果进行HEAD请求也是合理的,这样用户可以轮询HEAD来检查结果是否可用,然后使用 GET 下载它们,而不会在轮询期间突然被淹没。