我有一个关于微服务世界的问题。假设我有两个微服务,微服务A向微服务B发出请求。微服务B执行一些“长”操作,并向另一个微服务C发出请求。在结果中,微服务A等待来自微服务B的结果。如果微服务A“连接”到前端服务,用户发起操作并等待该操作的结果,则如何处理这样长的操作。在这些微服务中,有没有什么好的方法来处理长时间运行的任务?你对Sping Boot 中最有效和可扩展的案例有什么建议?先谢谢你。
wljmcqd81#
在高层次上,让我们将API调用分为两种主要类型1.同步1.异步
同步
这是使用RestTemplate,WebClient,FeignClient等实现的理想情况,其中微服务A将等待微服务B的响应。非常适合快速操作并涵盖大多数使用情形
RestTemplate
WebClient
FeignClient
异步
正如@taleodor提到的,另一种方法是实现对其他微服务的async调用,它只会返回Run id或Acknowledgement id来指示长时间运行的进程开始。要获取该进程的状态,您可以考虑通过Message queue(如ActiveMQ或Apache Kafka)实现它,它基于生产者/消费者或Publisher/subscriber (pub/sub)的概念,在您长期运行的微服务中,一旦完成,微服务A或B将订阅该事件并读取响应!除了消息队列之外,微服务A还可以实现scheduled task来检查进度完成或资源更新,具体取决于如何实现它!
async
Run id
Acknowledgement id
Message queue
ActiveMQ
Apache Kafka
Publisher/subscriber (pub/sub)
scheduled task
1条答案
按热度按时间wljmcqd81#
在高层次上,让我们将API调用分为两种主要类型
1.同步
1.异步
同步
这是使用
RestTemplate
,WebClient
,FeignClient
等实现的理想情况,其中微服务A将等待微服务B的响应。非常适合快速操作并涵盖大多数使用情形
异步
正如@taleodor提到的,另一种方法是实现对其他微服务的
async
调用,它只会返回Run id
或Acknowledgement id
来指示长时间运行的进程开始。要获取该进程的状态,您可以考虑通过Message queue
(如ActiveMQ
或Apache Kafka
)实现它,它基于生产者/消费者或Publisher/subscriber (pub/sub)
的概念,在您长期运行的微服务中,一旦完成,微服务A或B将订阅该事件并读取响应!除了消息队列之外,微服务A还可以实现
scheduled task
来检查进度完成或资源更新,具体取决于如何实现它!