如何处理 REST 中的异步操作

2022-09-04 04:02:32

我需要了解在REST中处理异步操作的方法是什么,以及它们的优点和缺点是什么。我发现的一些方法:

  1. 基于资源:其中,操作的状态建模为状态。用户进行异步 REST 调用(PUT、POST 等)获取或响应 ()。此外,通过 GET 重复轮询状态 URI,以检查操作执行的状态/进度/消息。AcceptedIn-Progress202

    问题:此资源应在服务器上处于活动状态多长时间?如果客户端在操作完成之间的时间间隔内进行大轮询,我们如何返回状态?似乎保留执行状态会起作用。但是,何时存档/删除,坚持多长时间,这是一种标准方法吗?

  2. 基于回调:需要异步请求具有回调 URI 的位置。请求以异步方式处理,并在完成后调用具有操作状态/结果的回调 URI。

    问题:这似乎更优雅,并且服务器端涉及的开销更少。但是如何处理回调服务器间歇性停机、无响应等情况呢?实现典型的重试,其中回调 URI 也提供重试配置?这种方法还有其他缺点吗?

  3. Servlet 3.0 异步支持:其中 HTTP 客户机与 Java Servlet 建立连接,Java Servlet 在显式关闭之前一直保持打开状态,直到关闭的客户机和服务器可以通过它进行异步通信。

    问题:由于其Servlet 3.0规范,我认为Spring REST实现的Jersey目前还没有使用这种方法。是否有任何特定的REST实现利用类似的方法或指针来实现它的方法?

  4. 还有其他方法,也许是商业方法?


答案 1

Spring 3.2+ 支持 Servlet 3.0 的异步功能。来自春季博客

您可以通过更改任何现有的控制器方法以返回可调用来使该方法异步。例如,返回视图名称的控制器方法可以改为返回 Callable。返回名为 Person 的对象的@ResponseBody可以改为返回 Callable。对于任何其他控制器返回值类型也是如此。

泽西岛 2+ 还支持异步服务器。请参阅参考文档中的异步服务和客户端一章。


答案 2

我认为,这种方法取决于初始请求和操作结束之间的时间差。

  • 对于短时间操作(<10s),我只会让请求保持打开状态,并在操作完成后返回响应;
  • 对于长时间操作(<30米),我会使用servlet 3.0或彗星模型;
  • 对于极长的操作(小时,天)来说,足够好的方法,对我来说,只是基于客户端的轮询或具有大超时的彗星。

推荐