【发布时间】:2019-05-17 00:25:58
【问题描述】:
问题在于如何设计一个 REST Web 服务来执行耗时的工作(数量级为几秒和几分钟)。
最快的解决方案是如下进行:
- 客户端向服务器发送POST请求(POST /job),答案有 HTTP 状态 202 并将包含作业 ID;
- 客户端通过 GET 定期询问作业状态(例如
GET /job/:id/status); - 当作业完成时,客户端使用 GET 请求结果(例如
GET /job/:id/result)。
我不喜欢第 2 步,因为有许多工作正在进行,服务器不必要地超载。 为了避免这种情况,我想到了另外两个解决方案:
- 当客户端执行第一个 POST 请求时,它还会给出一个 URL,该 URL 可以 用作来自服务器的回调。当服务器结束 详细说明,它将通过 GET/POST 通知此 URL 的客户端 请求;
- 服务器提供WebSocket,客户端可以在其中注册 并在工作完成时获得“通知”;
所有三个解决方案都有我不喜欢的方面:
- 轮询:服务器过载;
- 回调: 客户端必须为服务器提供一个 URL;
- websocket: 为什么要向 REST web 服务引入另一种“技术”? 也许,在这一点上,最好只使用 websockets 来做 所有请求。
还有其他解决方案吗?如果不是,您认为这三个中哪一个更可靠?
【问题讨论】:
-
您始终可以选择对频繁轮询的客户端进行速率限制。您的建议还要求客户端也作为服务器工作,以便实际的服务器可以扮演客户端的角色。这在某种程度上违反了客户端-服务器范式。如果您需要持续的来回通信,我猜 REST 不是适合您的架构。
-
好问题....
标签: rest asynchronous polling