Настройка распределённых Background Jobs (несколько воркеров)

Вступление: почему один воркер — это риск

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Настройка распределённых Background Jobs (несколько воркеров)
Сложный
~2-3 дня

Наши компетенции:

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

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1418
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1286
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    983
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1243
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    983
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    998

Вступление: почему один воркер — это риск

Представьте: ваш единственный воркер обрабатывает тысячу задач в минуту. Внезапно он падает — и очередь нарастает, письма не отправляются, транскодирование стопорится. Без репликации и распределения вы теряете данные. На одном проекте с пиком 12 тыс задач в минуту мы развернули 8 воркеров на 4 серверах с Redis и снизили среднее время выполнения с 40 до 8 секунд. Распределённые background jobs — это не просто копии воркеров, а продуманная архитектура: идемпотентность, блокировки, мониторинг.

Какие проблемы решаем

Потеря задач при падении воркера. Без репликации очереди задача зависает. Брокер хранит сообщения, а retry_after возвращает их в очередь. При правильной настройке retry_after (больше максимального timeoute задачи) потеря исключена.

N+1 запросов к базе. Один воркер обрабатывает задачи последовательно, растёт время выполнения. Несколько воркеров параллелят нагрузку. В проекте с 50 воркерами мы видели снижение времени обработки с 3 минут до 12 секунд.

Дедлоки при конкурентном доступе. Два воркера могут взять одну задачу. Решаем distributed locks через Redis SET NX PX. Блокировка с TTL 120 секунд гарантирует, что задача выполнится ровно один раз.

Почему Redis чаще выбирают для очередей?

Redis быстрее RabbitMQ в 3 раза при операциях push/pop и не требует настройки exchange. Для Laravel Horizon это нативный инструмент. RabbitMQ даёт сложную маршрутизацию (fanout, topic) — нужна, если задачи распределяются по разным очередям с разными приоритетами. Но для 90% проектов Redis достаточно.

Брокер Пропускная способность Сложность Routing Надёжность
Redis 100k msg/s Низкая Простой Redis Sentinel/Cluster
RabbitMQ 50k msg/s Средняя Fanout, Topic Кластер с mirrors
SQS 10k msg/s Высокая Ограничен Управляемый AWS UDP

Подробнее о Redis можно прочитать в официальной документации.

Как настроить retry_after правильно?

retry_after — критично: должно быть больше timeout задачи. Для транскодирования видео ставим 3600, для email-рассылок — 180, для API-запросов — 90. Значение меньше timeout приведёт к повторному выполнению задачи до её завершения.

Как обеспечить идемпотентность?

При распределённых воркерах одна задача может быть выполнена дважды (если воркер упал после взятия). Используем distributed lock:

class ProcessPaymentJob implements ShouldQueue { public function handle(): void { $lock = Cache::lock("payment:{$this->paymentId}", 120); if (!$lock->get()) { $this->release(10); return; } try { if ($payment?->status !== 'pending') return; $this->processPayment($payment); } finally { $lock->release(); } } } 

Cache::lock() использует Redis SET NX PX — атомарная блокировка.

Разделение воркеров по типу нагрузки

На разных серверах запускаем воркеры для разных очередей. Например:

  • API-сервера: очереди critical, default
  • Медиа-сервер (с GPU): transcoding, media
  • Фоновые отчёты: batch, reports, low

Supervisor на медиа-сервере:

[program:media-worker] command=php /var/www/artisan queue:work --queue=transcoding,media --timeout=3600 --max-jobs=1 numprocs=2 autostart=true autorestart=true user=www-data stopwaitsecs=3600 

stopwaitsecs должен быть не меньше максимального timeout задачи, иначе при деплое процесс убьют. Сравнение конфигураций по типам очередей:

Тип очереди Timeout retry_after Количество воркеров
critical 90 120 4
default 300 360 8
transcoding 3600 3700 2
batch 600 650 1

Мониторинг и алерты

Для контроля состояния воркеров настраиваем Prometheus и Grafana: экспортируем длину очередей, время выполнения, количество ретраев. На основе метрик можно автоматически масштабировать количество воркеров через HPA в Kubernetes. Laravel Horizon даёт готовый дашборд, но для production мы рекомендуем связку Prometheus + Alertmanager — уведомления в Telegram/Slack при росте очереди или падении воркеров.

Пример настройки Prometheus экспортера для очереди Для экспорта метрик очереди Redis используйте `phpredis-exporter` или специальный пакет для Laravel. В Kubernetes настройте ServiceMonitor, чтобы Prometheus автоматически собирал метрики.

Этапы работы

  1. Аналитика: изучаем нагрузку, выбираем брокер (Redis/RabbitMQ), проектируем схему очередей. Собираем метрики текущей очереди.
  2. Настройка инфраструктуры: разворачиваем брокер (Redis Cluster или RabbitMQ), настраиваем мониторинг (Prometheus, Horizon dashboard).
  3. Реализация: конфигурация воркеров, distributed locks, идемпотентность. Пишем тесты на конкурентное выполнение.
  4. Тестирование: симулируем падение воркеров, смотрю метрики, проверяем дедлоки. Нагружаем 1000 задач за 30 секунд.
  5. Деплой: настройка Supervisor, HPA (если Kubernetes), запуск Horizon. План отката — за минуту.

Что входит в работу

  • Документация по конфигурации брокера и воркеров.
  • Доступы к мониторингу (Horizon dashboard, Prometheus).
  • Обучение команды: как добавлять новые очереди, обрабатывать сбои.
  • Поддержка 2 недели после запуска.

Сроки и стоимость

Базовая настройка (Redis + Horizon на 2-х серверах) — 1 день. С distributed locks и идемпотентностью — до 2 дней. Интеграция с Kubernetes HPA — отдельный проект на 1–2 дня. Стоимость рассчитывается индивидуально. Оценим ваш проект — напишите нам.

Гарантируем: более 5 лет опыта, 50+ проектов с распределёнными очередями, ни одной потерянной задачи. Получите консультацию — расскажите о своей нагрузке, мы предложим архитектуру. Свяжитесь с нами для детального обсуждения.