Блог

Очередь задач в маркетплейсе: как это работает

Когда пользователь нажимает «Оформить заказ», он ждёт мгновенного ответа. Но за этим кликом скрываются десятки операций: резервирование остатков, расчёт комиссии, отправка писем продавцу и покупателю, обновление статистики, запрос к платёжному шлюзу. Если делать всё это синхронно — запрос зависнет на 5–10 секунд, а при пиковой нагрузке сервер ляжет. Именно поэтому очередь задач в маркетплейсе — не опция «для больших», а базовый архитектурный элемент уже с первых тысяч транзакций в день.

Что такое очередь задач и зачем она нужна

Очередь задач (task queue) — это механизм, при котором тяжёлая или не критичная по времени операция не выполняется прямо в HTTP-запросе, а помещается в буфер и обрабатывается отдельным процессом — воркером. Запрос пользователя возвращает ответ немедленно, а реальная работа идёт в фоне.

Классическая схема выглядит так:

  1. Приложение кладёт задачу в брокер сообщений (RabbitMQ, Redis, Kafka).
  2. Один или несколько воркеров забирают задачи из очереди и выполняют их.
  3. Результат сохраняется в базу или отправляется через WebSocket/push-уведомление.

Без этого механизма любой всплеск активности — распродажа, старт рекламной кампании — превращается в деградацию сервиса или даунтайм.

Какие процессы маркетплейса обязательно выносить в асинхрон

Не всё подряд нужно асинхронизировать — только то, что либо долго выполняется, либо допускает небольшую задержку без ущерба для UX.

Уведомления и письма

Отправка email и push-уведомлений через внешние сервисы (SendGrid, Firebase) занимает от 200 мс до нескольких секунд. Пользователь не должен ждать этого в момент действия. Все нотификации — в очередь.

Обработка платежей и сверка

Запрос к платёжному шлюзу может зависнуть из-за таймаута на стороне банка. Асинхронная обработка позволяет повторить попытку автоматически (retry-логика) без потери транзакции.

Пересчёт рейтингов и рекомендаций

Рейтинг продавца, персональные рекомендации, агрегированная статистика — всё это считается по расписанию или по событию, но не в момент запроса покупателя. Задержка в несколько минут здесь абсолютно приемлема.

Генерация документов

PDF-накладные, акты, счета — тяжёлые операции с шаблонизатором и иногда с обращением к S3. Формируются в фоне, ссылка на файл отдаётся после готовности.

Синхронизация с внешними системами

Выгрузка в 1С, обновление остатков от поставщиков через API, синхронизация с CRM — всё это потоковые задачи, которые не должны блокировать основной поток.

Сравнение брокеров: RabbitMQ, Redis (Celery/BullMQ), Kafka

Брокер Лучше подходит для Гарантия доставки Порог вхождения
Redis + Celery / BullMQ Старт, средние нагрузки, Python/Node-стек At-least-once (с ACK) Низкий
RabbitMQ Сложная маршрутизация, несколько типов воркеров At-least-once, персистентные очереди Средний
Apache Kafka Высокий throughput, event sourcing, аналитика Exactly-once (с настройкой) Высокий

Для большинства маркетплейсов на старте достаточно Redis + Celery (Python) или BullMQ (Node.js). Kafka оправдана, когда суточный объём событий превышает несколько миллионов и нужен полный лог для аналитики или восстановления состояния.

Типичные ошибки при проектировании очередей

  • Одна очередь на всё. Срочные задачи (подтверждение оплаты) и фоновые (пересчёт рейтинга) конкурируют за воркеры. Решение — отдельные очереди с разными приоритетами и числом воркеров.
  • Нет retry и dead-letter queue. Если задача упала из-за временной ошибки сети, она должна повториться. Если упала 3–5 раз подряд — уйти в DLQ для ручного разбора, а не потеряться.
  • Идемпотентность не проверяется. При at-least-once доставке одна задача может выполниться дважды. Без проверки уникальности это приводит к двойным списаниям или дублированным письмам.
  • Нет мониторинга очереди. Растущий backlog — первый симптом того, что воркеры не справляются. Без алертов это обнаруживается только когда задержки стали заметны пользователям.
  • Слишком большие payload в очереди. В задачу кладут весь объект заказа вместо его ID. Это увеличивает нагрузку на брокер и создаёт проблемы с актуальностью данных. Правило: в очередь — только идентификатор и тип события.

Как масштабировать воркеры под нагрузку

Горизонтальное масштабирование воркеров — одно из главных преимуществ асинхронной архитектуры. Алгоритм простой:

  1. Настроить метрику: длина очереди + среднее время обработки задачи.
  2. При превышении порога (например, backlog > 500 задач дольше 2 минут) — автоматически поднять дополнительные инстансы воркеров через Kubernetes HPA или аналог.
  3. После спада нагрузки — масштабировать вниз, чтобы не платить за простаивающие контейнеры.

Такой подход позволяет пережить пиковые нагрузки (черная пятница, старт акции) без ручного вмешательства и без переплаты за мощности в обычное время. Если вы планируете разработку маркетплейса, закладывайте эту логику в архитектуру с первого спринта — ретрофит обходится в 3–4 раза дороже.

Часто задаваемые вопросы

С какого объёма транзакций нужна очередь задач в маркетплейсе?

Очередь задач актуальна уже при 50–100 заказах в день, если на каждый заказ приходится отправка уведомлений, обращение к внешним API и генерация документов. Дело не только в объёме, но и в количестве внешних зависимостей. Даже небольшой маркетплейс с ненадёжным платёжным шлюзом выиграет от асинхронной обработки платежей с retry-логикой.

Можно ли использовать базу данных как очередь задач?

Технически — да, и некоторые команды используют таблицу в PostgreSQL как простейшую очередь (паттерн «outbox»). Это работает на небольших нагрузках и упрощает транзакционную согласованность. Но при росте нагрузки такой подход создаёт избыточный polling и нагружает БД. Специализированный брокер (Redis, RabbitMQ) справляется с этим в разы эффективнее.

Как отлаживать задачи, которые зависли или упали?

Обязательный минимум: dead-letter queue с сохранением payload и трассировки ошибки, дашборд состояния очередей (Flower для Celery, Bull Board для BullMQ), структурированные логи с task_id. При таком стеке любую упавшую задачу можно воспроизвести вручную и найти причину за минуты, а не часы.

Хотите обсудить архитектуру вашего проекта?

Грамотно выстроенная очередь задач — это не усложнение, а фундамент надёжной платформы. Команда Aris.Web проектирует и реализует асинхронную архитектуру в рамках разработки маркетплейса под ключ: от выбора брокера до настройки автомасштабирования воркеров. Если вы хотите обсудить архитектуру вашего проекта — позвоните по номеру +7 (977) 326-69-09 или оставьте заявку на странице arisweb.ru/kontakty. Разберём задачу и предложим конкретное решение.

ARISWEB · ПОД КЛЮЧ ЗА 2 НЕДЕЛИ
Нужно такое решение? Сделаем и опубликуем за 2 недели
Фиксированная цена, оплата онлайн, гарантия публикации в срок.
author-avatar

О Роман Воронов

Роман Воронов — менеджер продаж Aris.Web. Более 15 лет в IT: запуск цифровых платформ, мобильных приложений и маркетплейсов для e-commerce, логистики, промышленности, образования и бизнес-автоматизации. Помогает заказчикам подобрать решение и рассчитать проект.