问题的多线程解决方案 - RxJava vs ExecutorService

时间:2021-03-18 23:53:21

标签: multithreading rest rx-java spring-webflux executorservice

我正在尝试构建一个需要一些并发性的应用程序,因为吞吐量很重要。

步骤可以总结如下:

  1. 我有多个 AccountCollector 类。每个都从两个不同的 REST 端点检索 UserAccounts 并将响应组合到一个列表中。 所以

AccountCollector1 -> (AccountRestService1, AccountRestService2) -> 返回列表

AccountCollector2 -> (AccountRestService3, AccountRestService4) -> 返回列表

  1. 理想情况下,AccountCollector 中的调用应该是并发的。它应该发送请求并等待直到两者都返回,然后对结果进行一些处理并通知等待结果的人

  2. 理想情况下,AccountCollector 也应该并行运行,它们不相互依赖。

因此有两个级别的并发,AccountCollector 并行运行,AccountRestServices 在每个 AccountCollector 中并行运行。

我正在为此探索最佳实现。

我开始使用 Spring Webflux,以便 AccountRestService 返回 Mono。

我认为 RxJava 将是理想的,但我未能找到一种方法来合并结果 合并一直等到所有 REST 客户端都返回 Mono 或至少超时/失败

所以我继续使用 ExecutorService(下面的伪代码)实现了并行性。 我也使用 ExecutorService 来实现 AccountCollector 之间的并行

我的问题如下:

  1. 对我来说,我混合使用 ExecutorService 和反应式编程这一事实表明有些地方是错误的。对吗?
  2. 鉴于未来 AccountCollector 的数量可能会增长到数百个 - ExecutorService 是不是比 RxJava 更好的解决方案?
  3. 如果没有,使用 RxJava 合并对 REST 客户端的调用的最佳方法是什么?有什么建议吗?

抱歉问了这么冗长的问题,我很乐意提供更多详细信息。困扰我的主要事情是我从 WebFlux 开始,现在我觉得我失去了它给我的任何优势。

谢谢!

public interface AccountRestService {
    Mono<UserAccount> fetchUserAccount();
}

public class AccountCollector {

public List<UserAccount> collect() {
        ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
        CompletionService<List<UserAccount> pool = new ExecutorCompletionService<>(executor);

        ///submit to pool two rest clients
        // get from pool, collect
}

}

0 个答案:

没有答案
相关问题