如何设计具有外部阻塞 API 调用的响应式微服务?
Posted
技术标签:
【中文标题】如何设计具有外部阻塞 API 调用的响应式微服务?【英文标题】:How to design reactive microservices, which have external blocking API calls? 【发布时间】:2019-03-12 08:04:19 【问题描述】:我有一些微服务,它们应该在 WebFlux 框架之上运行。每个服务器都有自己的带有 Mono 或 Flux 的 API。我们使用的是 Spring 支持的 MongoDB(Spring Data MongoDb Reactive)。
问题是外部阻塞 API,我必须在我的系统中使用它。
我有一个解决方案。我可以将阻塞 API 调用包装在专用线程池中,并将其与 CompletableFuture 一起使用。
还有什么可以解决我的问题吗?我认为,全新的 Rsocket 无法解决我的问题。
【问题讨论】:
阻塞API是指简单的http请求-响应类型API? spring docs.spring.io/spring-framework/docs/5.0.0.M1/… 存在响应式 HTTP 客户端。 @DavidSzalai 是的,我的意思是简单的 http 请求-响应类型 API。 我明白了。然后,如果它使用非阻塞 IO,则可以使用我链接的响应式 Web 客户端(您应该检查一下,但我认为确实如此)。如果您考虑一下,专用的线程池和用期货包装阻塞 api 调用并不会使其成为非阻塞。它只是将“阻塞”部分外包给另一个线程池。简单来说,非阻塞的整个目的是不等待响应,而是在响应到达时得到通知(例如以事件的形式),因此它需要一些低级别的操作系统协调。 【参考方案1】:1.如果可能,您可以使用 WebClient 类将阻塞 API 调用更改为响应式方式。
参考资料:
-
Reference guide
WebClient API
A simple, complete sample
2.如果阻塞 API 不能更改为响应式 API,我们应该有一个专用的、经过良好调整的线程池并在那里隔离阻塞代码。 还有一个例子here。
【讨论】:
【参考方案2】:我不明白为什么不能在 Flux 或 Mono 中封装阻塞 API 调用。如果你觉得演员模型更容易,你也可以integrate Akka with Spring。
【讨论】:
【参考方案3】:RSocket 应该是一个完美的选择,很好的教程让你开始
https://www.baeldung.com/spring-boot-rsocket
https://spring.io/blog/2020/04/06/getting-started-with-rsocket-spring-boot-channels
【讨论】:
以上是关于如何设计具有外部阻塞 API 调用的响应式微服务?的主要内容,如果未能解决你的问题,请参考以下文章
在节点中创建 REST API 时,如何将来自对外部网站的请求的 http 响应流式传输到原始 api 调用?