Твое 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 — это не игра, это инструмент. Он спасает от тупого блокирования при больших нагрузках, но требует внимания к деталям: настройки соединений, стабильного слушателя, обработку ошибок. Если хочешь красивую магию, ищи что-то другое. Тут ты получаешь железную асинхронку и реальные проблемы, которые надо решать своими руками.
0 комментариев