如何在REST中处理异步操作

har*_*rsh 13 java rest asynchronous http

我需要了解在REST中处理异步操作的方法以及它们的优点和缺点.我找到的一些方法:

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

    问题:此资源在Server上应该有多长时间处于活动状态?如果客户端在操作完成之间的大间隔轮询中,我们如何返回状态?似乎坚持执行状态会起作用.但是,存档/删除的时间有多长,这种标准方法是什么?

  2. 基于回调:需要异步请求才能拥有回调URI.异步处理请求,完成后调用带有操作状态/结果的回调URI.

    问题:这似乎更优雅,服务器端的开销更少.但是如何处理回调服务器间歇性关闭,没有响应等情况?实现回调URI提供重试配置的典型重试?这种方法还有其他缺点吗?

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

    问题:自从它的Servlet 3.0规范以来,我认为Jersey,即Spring REST实现,目前还没有使用这种方法.是否有任何特定的REST实现,它使用类似的方法或指针来实现它的可能性?

  4. 任何其他方法,也许是商业方法?

mat*_*sev 6

Spring 3.2+支持Servlet 3.0的异步功能.来自Spring博客:

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

Jersey 2+还支持异步服务器.请参阅参考文档中的" 异步服务和客户端"一章.


use*_*686 3

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

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