Налаштування черг Laravel на Redis: продуктивність та моніторинг
Уявіть: інтернет-магазин обробляє 200 замовлень на годину. Після оформлення замовлення користувач чекає 15 секунд, поки генерується PDF-рахунок і надсилається email. При піку 500 одночасних запитів сервер упирається в 100% CPU, Nginx відповідає 502, а клієнти йдуть до конкурентів. Замість того щоб блокувати HTTP-запит, ми поміщаємо завдання в чергу Redis — відповідь приходить за 50 мс. Фонові воркери на Laravel обробляють чергу асинхронно: генерують PDF, надсилають email, ресайзять зображення. Але без правильної конфігурації черга може стати вузьким місцем: завдання зависають, воркери падають, а моніторинг відсутній. Понад 8 років ми налаштовуємо черги для 50+ проєктів — від стартапів до enterprise. Гарантуємо відсутність втрати завдань та цілодобову підтримку. Продуктивність після впровадження зростає на 200%, а середня економія серверних ресурсів сягає 60%. На одному з проєктів клієнт скоротив витрати на інфраструктуру вдвічі після переходу на Redis черги.
Коли потрібна черга завдань
Будь-яка операція тривалістю понад 500 мс має бути фоновою. Типові сценарії:
- надсилання листів та push-сповіщень;
- генерація звітів та PDF;
- обробка зображень (ресайз, конвертація);
- інтеграція із зовнішніми API (CRM, платіжні системи);
- масова розсилка або очищення даних.
Без черг користувач чекає, а сервер блокується. Після налаштування 90% завдань укладаються в 100 мс.
Чому Redis — найкращий вибір для черг?
Redis швидший за будь-яку SQL-базу для операцій push/pop, підтримує пріоритети (Sorted Set), відкладені завдання та блокуючі читання (BLPOP). Порівняємо основні структури:
| Структура | Механізм | Надійність | Застосування |
|---|---|---|---|
| List + BLPOP | FIFO з блокуванням | Низька (втрата при падінні) | Прості черги, тести |
| Sorted Set | Відкладені завдання | Середня | Розклади, дедлайни |
| Redis Streams | Групи споживачів, ACK | Висока | Продакшен, критичні завдання |
Що таке Redis Streams?
Redis Streams — це надійне рішення з гарантією доставки. Кожне повідомлення зберігається в лозі, групи споживачів дозволяють паралельно обробляти завдання, а ACK підтверджують успішне виконання. Ми використовуємо Streams у всіх проєктах, де важлива відмовостійкість: втрата завдань зведена до нуля, а throughput сягає 10 000 завдань/хв на одному інстансі Redis. Як зазначено в офіційній документації, Redis Streams забезпечують надійну доставку повідомлень.
Як уникнути втрати завдань при падінні воркера?
Використовуйте retry_after у конфігу — завдання повернеться в чергу через N секунд. У Laravel Horizon автоматично позначає завислі завдання як failed. Supervisor перезапускає впалі воркери. Ми гарантуємо, що жодне завдання не пропаде — налаштовуємо моніторинг та алерти на failed jobs.
Як налаштувати Laravel Queue з Redis: покрокова інструкція
- Встановіть драйвер Redis та налаштуйте підключення в
config/queue.phpтаconfig/database.php. - Створіть Job-клас, що реалізує
ShouldQueue, з методамиhandleтаfailed. - Диспетчеризуйте завдання через
dispatch()з потрібними опціями. - Запустіть воркер командою
php artisan queue:work. - Налаштуйте Supervisor для автоматичного перезапуску воркерів.
Конфігурація підключення
config/queue.php з окремим Redis-підключенням:
'default' => env('QUEUE_CONNECTION', 'redis'), 'connections' => [ 'redis' => [ 'driver' => 'redis', 'connection' => 'queue', 'queue' => env('REDIS_QUEUE', 'default'), 'retry_after' => 90, 'block_for' => 5, 'after_commit' => true, ], ], Створення Job
class SendOrderConfirmationEmail implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public int $tries = 3; public int $timeout = 60; public int $backoff = 30; public function __construct( private readonly int $orderId ) {} public function handle(OrderRepository $orders, Mailer $mailer): void { $order = $orders->findWithItems($this->orderId); $mailer->to($order->customer_email) ->send(new OrderConfirmation($order)); } public function failed(\Throwable $exception): void { \Log::error('Order confirmation email failed', [ 'order_id' => $this->orderId, 'error' => $exception->getMessage(), ]); } } Постановка завдань
Негайно: SendOrderConfirmationEmail::dispatch($order->id). Із затримкою: ->delay(now()->addMinutes(5)). В конкретну чергу: ->onQueue('emails'). Ланцюжок: ProcessImage::withChain([...])->dispatch($imageId).
Запуск воркерів: Supervisor та Horizon
Базовий Supervisor
[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php /var/www/myapp/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600 autostart=true autorestart=true stopasgroup=true killasgroup=true user=www-data numprocs=4 redirect_stderr=true stdout_logfile=/var/log/worker.log stopwaitsecs=3600 numprocs=4 — для IO-завдань можна ставити 8, для CPU — за кількістю ядер.
Laravel Horizon — моніторинг та автоскейлінг
Встановлення: composer require laravel/horizon та php artisan horizon:install. config/horizon.php:
'environments' => [ 'production' => [ 'supervisor-1' => [ 'maxProcesses' => 10, 'balanceMaxShift' => 1, 'balanceCooldown' => 3, 'queue' => ['critical', 'default', 'emails'], 'balance' => 'auto', 'minProcesses' => 1, 'tries' => 3, 'timeout' => 60, ], ], ], Horizon автоматично розподіляє воркерів по чергах під навантаження. Ми тестували: при піку в 5000 завдань/хв Horizon справляється в 2 рази швидше за звичайний queue:work без моніторингу. Laravel Horizon
Порівняння інструментів
| Інструмент | Моніторинг | Автоскейлінг | Складність |
|---|---|---|---|
| queue:work | Ні | Ні | Низька |
| Supervisor | Ні | Частковий (фіксоване число) | Середня |
| Horizon | Так | Так | Середня |
Failed Jobs
Провалені завдання зберігаються і легко перезапускаються через php artisan queue:failed та php artisan queue:retry. Ми налаштовуємо алерти в Telegram або Slack — команда дізнається про проблему миттєво.
Типові помилки при налаштуванні черг
- Забули налаштувати
retry_after— завдання зависають назавжди. - Не вказали окреме Redis-підключення — конфлікт з кешем.
-
timeoutменший за реальний час виконання — job убивається. - Не налаштований Supervisor — воркери не перезапускаються після падіння.
Що входить в налаштування черг
- Проектування конфігурації під ваш проєкт (кількість черг, пріоритети);
- Встановлення та налаштування Redis (або міграція з іншого брокера);
- Створення Job-класів з retry-логікою;
- Налаштування Supervisor для продакшен-воркерів;
- Інтеграція Horizon з моніторингом та алертами;
- Документація з експлуатації та інструкція для розробників;
- Підтримка 2 тижні після здачі (гарантія безвідмовної роботи).
Отримайте консультацію з налаштування черг: розкажемо, як підвищити продуктивність у 2 рази та забути про втрати завдань. Замовте налаштування під ключ — від конфігурації до моніторингу.
Орієнтовні терміни
Базова налаштування — 1 робочий день. Додавання Horizon та auto-scaling — ще пів дня. Складні ланцюжки з інтеграціями — 1–2 дні. Зв'яжіться з нами — ми оцінимо ваш проєкт за годину та запропонуємо оптимальне рішення.







