Налаштування черг 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 дні. Зв'яжіться з нами — ми оцінимо ваш проєкт за годину та запропонуємо оптимальне рішення.







