Вступить в клуб →
сложнаявопросАсинхронность и event loop

CPU-bound задача в веб-процессе: куда её вынести

Один из эндпоинтов генерирует PDF-документ: разбор шаблона и рендер занимают около 1,5 секунды чистого процессорного времени, вызывается он примерно 3 раза в минуту. После релиза p95 у всех остальных ручек сервиса вырос с 120 мс до 900 мс, хотя нагрузка не менялась.

Что действительно решит проблему?

  • Обернуть генерацию в `async`-функцию и вызывать её через `await` — тогда рендер уйдёт в фон и не займёт основной поток
  • Вынести рендер в worker threads или в отдельный воркер за очередью, а клиенту сразу отвечать 202 со ссылкой на результат
  • Разбить рендер на части и вызывать их через `setTimeout(..., 0)`: части попадут в разные такты цикла и пойдут параллельно
  • Добавить реплик сервиса за балансировщиком: нагрузка размажется по инстансам, и деградация уйдёт без правок в коде

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела