Многопоточность senior
Чем это грозит в проде?
Ответ
Сценарий: микросервис обрабатывает 1000 RPS обычных запросов. Каждый из них где-то использует parallelStream (агрегация, фильтр коллекции). Все parallelStream делят один общий ForkJoinPool.commonPool() размером примерно (ядра-1), поэтому задачи выстраиваются в очередь, растёт конкуренция за потоки и латентность взлетает, а блокирующие операции внутри стрима могут застопорить весь пул.
Разбор: Все parallelStream по умолчанию делят один общий ForkJoinPool.commonPool() с числом потоков примерно (ядра-1). При 1000 RPS задачи выстраиваются в очередь к этому крошечному пулу, начинается конкуренция за потоки, латентность взлетает, а блокирующие операции внутри стрима могут вообще застопорить весь пул. Ловушка: пул не создаётся на каждый вызов и не масштабируется до RPS — он общий и фиксированный, поэтому проблема именно в насыщении и росте задержек.
Хочешь так же по своей компании — с вопросами по грейдам и задачами? Закажи гайд или забери свежее в Telegram.