Твое Laravel-приложение начинает зависать, когда приходит хотя бы сотня запросов на рассылку или обработку больших данных? Это момент, когда начинаешь понимать, что просто делать sleep() между запросами — не вариант. Тут на сцену выходит RabbitMQ — зверь для асинхронной обработки задач. Да, оно мощное, но не магическое. Нужно включить голову и не ждать, что просто поставил пакет и всё заработало.

Установка RabbitMQ

Первый удар по реальности — RabbitMQ не появляется сам по себе. Скачал, установил, запустил. Всё просто, если не боишься командной строки и Docker. Если у тебя нет опыта с настройкой очередей и портов, готовься попотеть.

Пакет для Laravel

Для Laravel нужен интерфейс к RabbitMQ. Берём php-amqplib/php-amqplib. Он простой, но не делает всю работу за тебя — тут без ручной настройки не обойтись.

composer require php-amqplib/php-amqplib

Да, это всего одна строка, но не жди, что после этого всё заработает само.

Настройка соединения

Создаём config/rabbitmq.php:

return [
    'host' => env('RABBITMQ_HOST', 'localhost'),
    'port' => env('RABBITMQ_PORT', 5672),
    'user' => env('RABBITMQ_USER', 'guest'),
    'password' => env('RABBITMQ_PASSWORD', 'guest'),
    'vhost' => env('RABBITMQ_VHOST', '/'),
];

И добавляем в .env реальные данные:

RABBITMQ_HOST=localhost
RABBITMQ_PORT=5672 RABBITMQ_USER=guest
RABBITMQ_PASSWORD=guest
RABBITMQ_VHOST=/

Если тут что-то не совпадает — RabbitMQ будет игнорить твои задачи, и ты будешь ругаться, пока не найдёшь причину.

Создание асинхронной задачи

Дальше надо написать задачу, которая будет лететь в очередь. Например, отправка письма:

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class SendEmailTask implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $email;

    public function __construct($email)
    {
        $this->email = $email;
    }

    public function handle()
    {
        // Тут твоя логика отправки письма
    }
}

Просто, да? На деле handle() может быть любым адом — от генерации PDF до обработки больших CSV. Главное — не думать, что Laravel сам разрулит твои проблемы.

Отправка задачи в очередь

Чтобы отправить задачу:

SendEmailTask::dispatch($email);

Вот и всё. Летит в очередь. Но она ещё не будет обрабатываться сама.

Слушатель очереди

Теперь нужна штука, которая будет реально слушать очередь и дергать задачи. Используем Artisan:

php artisan queue:work

Если хочешь, чтобы это работало как надо, запускать это лучше через supervisor или systemd, а не просто оставлять терминал открытым. RabbitMQ сам по себе не гарантирует, что задачи будут обрабатываться сразу, если слушатель упал.

Вот реальность: твоя первая очередь будет падать на пустяках — тайм-ауты, неправильные переменные окружения, задачи, которые забивают память. Настройка RabbitMQ — это почти как танцы с бубном. Ты быстро поймёшь, что ShouldQueue — это не волшебная кнопка «всё само сделается», а инструмент. И чем больше данных, тем больше деталей, которые придётся отлавливать руками.

Заключение

RabbitMQ в Laravel — это не игра, это инструмент. Он спасает от тупого блокирования при больших нагрузках, но требует внимания к деталям: настройки соединений, стабильного слушателя, обработку ошибок. Если хочешь красивую магию, ищи что-то другое. Тут ты получаешь железную асинхронку и реальные проблемы, которые надо решать своими руками.