Главная/Блог/Фоновые задачи и очереди в Node.js: рассылки, отчёты и файлы без тормозов на сайте

Фоновые задачи и очереди в Node.js: рассылки, отчёты и файлы без тормозов на сайте

Фоновые задачи и очереди в Node.js: рассылки, отчёты и файлы без тормозов на сайте
Клиент нажимает «Оформить заказ» — и сайт висит пять секунд. В этот момент в коде отправляется письмо о заказе, уведомление менеджеру и запрос в CRM, но пользователь этого не видит: он просто уходит к конкурентам. По данным Google, вероятность отказа растёт на 32%, если страница грузится дольше трёх секунд. Проблема решается архитектурно — «тяжёлые» операции уводятся в фоновые задачи и очереди. В статье объясняем, как это устроено в Node.js, какие задачи выносить в фон и что бизнес получает в цифрах.

Фоновые задачи простыми словами: официант и кухня

Представьте ресторан, где официант сам ходит на кухню готовить каждое блюдо. Пока он жарит стейк, остальные столики ждут. Именно так работает сайт без очередей: запрос пользователя «залипает», пока выполняется медленная операция.Фоновая схема устроена иначе. Веб-сервер принимает действие пользователя и мгновенно возвращает ответ: «Заказ принят, подтверждение придёт на почту». А «готовкой» занимаются отдельные процессы-обработчики (воркеры), которые берут задачи из общей очереди и выполняют в своём темпе. Пользователь получает скорость, а тяжёлая работа всё равно делается — просто не в момент ожидания клиента.

Какие задачи стоит выносить в очередь

Правило простое: если операция занимает дольше 200–300 мс и не нужна пользователю прямо сейчас — это кандидат в фоновые задачи.
  • Рассылки и уведомления — письма о заказах, SMS, push, сообщения в Telegram. Отправка одного письма через SMTP занимает 1–5 секунд, а рассылка на 5 000 адресов «в лоб» уронит сайт.
  • Генерация отчётов — выгрузки в Excel и PDF. Отчёт по продажам за квартал может собираться 30–60 секунд.
  • Обработка файлов — ресайз изображений, создание миниатюр, парсинг прайс-листов на 10 000 строк.
  • Обмен с CRM и 1С — синхронизация заказов и остатков, если внешняя система отвечает медленно (а она часто отвечает медленно).
  • Массовые операции — обновление цен по всему каталогу, импорт товаров, применение скидок к акции.

Как это устроено в Node.js

Node.js обрабатывает запросы в одном потоке — это его сила и слабость одновременно. Одна тяжёлая синхронная операция блокирует весь сервер, и страдают все пользователи, включая тех, кто просто листает каталог.Классический стек для очередей: Redis как быстрое хранилище задач и библиотека BullMQ поверх него. Задачи складываются в Redis, воркеры забирают их и выполняют параллельно с основным сайтом. Для регулярных операций — «отчёт каждый понедельник в 9:00» — используется планировщик или встроенные repeatable jobs BullMQ. Если добавлять Redis не хочется, на небольших нагрузках очередь можно организовать на PostgreSQL.

Что это даёт в цифрах: кейс интернет-магазина

Сценарий из практики: магазин с ~2 000 заказов в день, при оформлении заказа синхронно отправлялись письмо клиенту, уведомление менеджеру и запрос в CRM. Итог — оформление занимало 4–6 секунд, а при сбоях почтового сервера растягивалось до 30 секунд и заканчивалось ошибкой.После выноса отправки в очередь ответ сервера на оформление — 350–400 мс. Письма уходят с контролируемой скоростью 100 штук в минуту (почтовые провайдеры режут тех, кто шлёт без ограничений, и быстро отправляют в спам), а упавшая задача автоматически повторяется. Через месяц конверсия в оформленный заказ выросла примерно на 8% — без изменения дизайна и функционала, только за счёт скорости.

Что обязательно настроить

Очередь — это не просто «кинуть задачу в Redis». Чтобы система работала надёжно, нужны:
  • Повторные попытки — если почтовый сервер недоступен, задача должна повториться через 1, 5, 30 минут, а не исчезнуть навсегда.
  • Приоритеты — письмо о новом заказе важнее еженедельной рассылки; очередь обрабатывает срочное первым.
  • Идемпотентность — задача при сбое может выполниться дважды, и код должен это переживать без двойных списаний и двойных писем.
  • Мониторинг — панель вроде Bull Board и алерты в Telegram при накоплении упавших задач. Очередь без мониторинга — чёрный ящик.
  • Лимит параллельности — сколько задач выполняется одновременно, чтобы не положить сторонний API или собственную базу.

Частые ошибки при внедрении

Первая — хранить очередь в памяти процесса: перезапуск сервера — и все несформированные отчёты и письма пропали без следа. Вторая — запускать воркеры на том же сервере, что и сайт, без ограничения ресурсов: тяжёлая обработка файлов снова съедает процессор, и пользователи чувствуют тормоза.Третья ошибка — забывать про обратную связь: отчёт «улетел в фон», а человек сидит и ждёт загрузки файла. Правильно — показывать статус («готовим, пришлём на почту») и отдавать ссылку по готовности. Четвёртая — отсутствие ограничений при массовых рассылках: 5 000 писем за минуту — гарантированный бан отправителя у почтового провайдера.

Признаки, что вашему проекту нужна очередь

  • Оформление заказа, регистрация или отправка формы занимает заметно дольше секунды.
  • Вебхуки от CRM или платёжных систем иногда падают по таймауту — они требуют ответ за 3–5 секунд.
  • Массовые операции (импорт, рассылка) запускаются «ночью и вручную», потому что днём сайт не выдерживает.
  • После сбоя или обновления часть писем и уведомлений теряется безвозвратно.
  • Отчёты в админке падают по таймауту nginx (обычно 60 секунд).
Если узнали хотя бы два пункта — фоновая обработка окупится быстрее, чем любой редизайн.

Итог

Очереди и фоновые задачи — это не «украшение кода», а прямая работа с деньгами: скорость отклика сайта конвертируется в заказы, а надёжность доставки уведомлений — в повторные продажи. Для существующего проекта на Node.js внедрение Redis и BullMQ с воркерами — обычно 1–2 недели работы разработчика, включая обработку ошибок и мониторинг. Если сайт выполняет тяжёлые операции «в лоб» при каждом действии пользователя — самое время провести аудит и вынести их в фон. Это одна из самых быстрых инвестиций в производительность с измеримым результатом.

Нужна разработка?

Оставьте заявку — обсудим ваш проект и предложим решение