Веб-приложение Spring и асинхронные исполнения с использованием пула потоков
У меня есть весеннее приложение, которое выступает в качестве оркестратора, в обязанности которого входит объединение результатов 6+ других весенних веб-приложений, результаты которых являются взаимно исключающими друг друга, что означало, что каждый запрос к услуге может выполняться параллельно. Для этого мы использовали 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, который работает на основе исполнителя пула потоков. Любые указатели здесь с благодарностью.