Веб-приложение Spring и асинхронные исполнения с использованием пула потоков - PullRequest
0 голосов
/ 13 сентября 2018

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

...