在RESTful Web服务中,服务器是否可以花费很多分钟来响应?

时间:2016-04-27 11:11:27

标签: python rest flask restful-architecture flask-restful

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

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

作业完成后,客户端需要下载JSON转储。从100KB到100MB的任何地方。

我看到两个选项:

  1. 客户端将作业作为POST请求提交,而服务器的响应仅在作业完成时提供。响应包括JSON转储。
  2. 客户端将作业作为POST请求提交,服务器立即响应200 OK。然后,客户端每隔60秒提交一次GET状态请求。作业完成后,它会提交另一个GET请求来下载JSON转储。
  3. REST原则下首选哪个选项?

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

1 个答案:

答案 0 :(得分:5)

等待超过几秒是绝对禁止

大多数Web基础结构并非旨在处理如此长的延迟,并且某些代理/负载平衡器可能会超时 - 即使您的服务器最终产生响应,也没有人会在那里读取它。此外,用户将感到无聊并开始刷新/取消/无论如何。

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

  

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

(取自restapitutorial

因此,请回复202以及结果所在位置的句柄 - 在正文或回复标题中。然后,客户端可以轮询给定位置以查看作业状态并下载结果。

如果结果很大,那么对结果允许HEAD请求也是合理的,这样用户就可以轮询HEAD来检查结果是否可用,然后用{{1}下载它们在投票期间没有突然被淹没。