Наше приложение использует Spring @Async для запуска асинхронных задач (например, для параллельных вызовов API REST). Наш ThreadPoolTaskExecutor был сконфигурирован с 16 размерами основного пула, 128 максимальными пулами и 128 размерами очереди.
Асинхронные задачи могут запускать больше асинхронных задач и т. Д., Они могут стать довольно глубоко вложенными. При наличии достаточного количества одновременных запросов в сочетании с медленным временем отклика на называемый REST API мы легко можем оказаться в тупике. Все задачи в основном пуле ожидают результатов от дочерних задач в очереди. Дочерние задачи в очереди не будут выполнены, поскольку основной пул заполнен. Таким образом, тупик.
Асинхронные методы выглядят так:
@Async
public Future<String> asyncCallAPI() {
return new AsyncResult<>(callAPI());
}
Как лучше всего избежать этих тупиков?