首页 > 解决方案 > Spring Web 应用程序和使用线程池的异步执行

问题描述

我有一个 spring 应用程序,它充当协调器,其职责是聚合来自 6 个以上其他 spring web 应用程序的结果,这些应用程序的结果彼此互斥,这意味着每个服务查询可以并行完成。为此,我们将 CompletableFuture 与 ForkJoinPool 公共池一起使用,并具有默认池大小,并且由于我们在每个线程中的唯一工作是 IO 查询其他服务,因此当系统负载很大时,我们会看到线程池耗尽。

final List<CompletableFuture<List<Data>>> completableFutures = CompletableFuture.supplyAsync(() -> serviceToQuery.execute(...)).collect(Collectors.toList());
CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[completableFutures.size()])).join();

我们可以看到每秒约 3000 个请求,使用断路器将每个服务请求超时设置为 3 秒。我们已经看到这个设置也发生了超时。

如果有人能阐明如何针对大量查询进行调整或建议任何其他方法,我将不胜感激,我还研究了基于线程池执行器的 @Async。非常感谢这里的任何指针。

标签: javaspringmultithreadingexecutorserviceforkjoinpool

解决方案


推荐阅读