CPU-bound задача в веб-процессе: куда её вынести
Один из эндпоинтов генерирует PDF-документ: разбор шаблона и рендер занимают около 1,5 секунды чистого процессорного времени, вызывается он примерно 3 раза в минуту. После релиза p95 у всех остальных ручек сервиса вырос с 120 мс до 900 мс, хотя нагрузка не менялась.
Что действительно решит проблему?
- Обернуть генерацию в `async`-функцию и вызывать её через `await` — тогда рендер уйдёт в фон и не займёт основной поток
- Вынести рендер в worker threads или в отдельный воркер за очередью, а клиенту сразу отвечать 202 со ссылкой на результат
- Разбить рендер на части и вызывать их через `setTimeout(..., 0)`: части попадут в разные такты цикла и пойдут параллельно
- Добавить реплик сервиса за балансировщиком: нагрузка размажется по инстансам, и деградация уйдёт без правок в коде
