在 RESTful Web 服务中,服务器花很长时间来响应是否可以接受?

2024-03-06

我正在使用 Flask-restful 开发 RESTful Web 服务。

客户端需要能够请求服务器执行作业。这项工作可能需要大约 1 秒到大约 1 小时才能完成。一般情况下,预计需要 1-5 分钟。

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

我看到两个选项:

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

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

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


等待超过几秒钟是一个绝对禁止.

大多数 Web 基础设施的设计都无法处理如此长的延迟,并且某些代理/负载均衡器可能会超时 - 即使您的服务器最终生成响应,也没有人会在那里读取它。此外,用户会感到无聊并开始刷新/取消/诸如此类。

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

请求已被接受处理,但处理尚未完成。该请求最终可能会或可能不会被执行,因为在实际处理时可能会拒绝该请求。没有从诸如此类的异步操作重新发送状态代码的工具。

(取自重新架构 http://www.restapitutorial.com/httpstatuscodes.html)

所以回应202以及结果应该在哪里的句柄 - 无论是在正文中还是在响应标头中。然后客户端可以轮询给定位置以查看作业状态并下载结果。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 RESTful Web 服务中,服务器花很长时间来响应是否可以接受? 的相关文章

随机推荐