在执行异步处理时保持http请求

时间:2018-09-24 00:43:15

标签: java spring spring-mvc

我们有一个用作外观的API,封装了对内部服务的调用。我们正计划更改外观与内部服务之间的交互,因为我们正在修改内部服务以使用队列,从而使其更具弹性和弹性。我们现在无法更改客户端使用API​​的方式,这就是为什么我们希望在客户端和外观之间保持阻塞调用。

该服务将公开一个Web方法来接收请求,将消息发布到队列中,并尽快将调用返回到立面。处理完成后,该服务将调用立面的内部Web方法,释放第一个调用(立面的客户端)。

Call diagram

立面使用Spring Boot和MVC构建。问题是:如何“保持”客户端的http请求,等待服务发出的信号将数据返回给客户端?我们考虑了以下方法:

  • 首次调用API时,它将生成一个唯一的标识符并将其发送给内部服务。然后,立面中的Web方法将轮询(检查并休眠)单例对象(可能是ConcurrentHashMap),以查找与唯一标识符关联的对象。当内部服务向立面发出信号时,它将结果放在单例对象中,因此Web方法可以将信息返回给客户端。
  • 对Akka演员使用上述类似的方法

我们担心此解决方案的可扩展性和可用性(我们知道保留客户端http请求并不好,但是必须忍受一段时间)。

这里有人需要做类似的事情吗?使用了什么方法?有没有可以使用的框架(Java)?

1 个答案:

答案 0 :(得分:1)

许多技术可以用来解决您的问题,例如:spring mvc和spring webflux

  • 在春季MVC中,我已经使用DeferredResult,ResponseBodyEmitter和SseEmitter处理异步请求并将结果推回客户端。

https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-async