【问题标题】:Async communication between spring boot micro servicesSpring Boot 微服务之间的异步通信
【发布时间】:2018-03-17 00:58:46
【问题描述】:

我是 Spring Boot 新手并创建了 2 个微服务。 他们需要以同步和异步的方式相互通信。 对于同步通信,我可以使用 RestTemplate。 但是异步调用怎么办? 我对异步的要求是: 假设我正在从一项微服务中查询某些内容。由于要查询大量数据,因此要获取查询的数据需要一些时间。 在这种情况下,我需要将请求保存到某个事务表中,并返回带有 transactionId 和 callBackAPI 的响应。一段时间后,如果我用 transactionId 调用 callBackAPI。那么我应该可以得到之前查询到的数据了。

请帮帮我。

谢谢。

【问题讨论】:

  • @Krishna 您可能应该更新您的问题并定义异步通信的含义。异步对不同的人可能意味着不同的事情,尤其是在系统设计的上下文中。如果您的意思是您需要在系统之间交换 消息 并避免使用请求-响应范例(如 HTTP 调用),那么您将需要某种消息代理(如 RabbitMQ)
  • @geo 我已经更新了票。请帮忙
  • @Krishna 据我所知,没有现成的解决方案可以满足您的需求。你需要自己动手:)

标签: asynchronous spring-boot microservices spring-rabbit


【解决方案1】:

两种解决方案:

来自您的客户端的异步调用: Spring 提供了 RestTemplate 的异步版本: AsyncRestTemplate 使用此解决方案,您的客户端是异步的,您无需将数据存储在具有事务 ID 和内容的表中。

使您的端点异步(如果您不需要响应): Spring 允许您创建可以从 RestController 调用的asynchronous methods(services)。使用此解决方案,您可以执行问题中描述的操作(创建和存储将直接返回给客户端并启动异步作业的事务 ID)。

【讨论】:

  • @akil-reguig 感谢您的回答。我觉得第二种选择是更好的方法。但我在这里有一个查询。在 Async 方法正在处理某些内容期间,如果应用程序停止/关闭,那么该 Async 方法进程会发生什么?重新启动应用程序后它会暂停并恢复吗?还是会突然停止?请确认,谢谢。
  • 不,应用程序在重新启动后不会恢复工作。如果您残酷地杀死应用程序的进程,这将停止运行异步进程的线程,您将丢失内存中的所有内容。但是如果你只是向你的应用程序发送一个终止信号,应用程序将等到工作完成后再销毁弹簧上下文和应用程序。
  • @akil-reguig 您能否详细说明“但如果您只是向您的应用程序发送终止信号”?另外,有没有其他方法来处理这种情况?
  • 我说的是逗号kill。在您的应用程序进程 ID 上运行将正常关闭您的应用程序(这意味着如果一个线程仍在工作,它将等到结束后再关闭)。查看这篇文章:dzone.com/articles/managing-spring-boot
  • 如果我的回答能帮助您解决问题,请接受。
猜你喜欢
  • 1970-01-01
  • 2018-01-22
  • 2018-11-03
  • 2020-05-11
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2021-02-12
相关资源
最近更新 更多