Laravel. Робота з RabbitMQ
Якщо вас бентежить вимога знання RabbitMQ в описі вакансії, у мене для вас є гарні новини. Після прочитання цієї статті у вас більше не буде цього обмеження.
Що це взагалі таке? Це брокер повідомлень. Відправник надсилає повідомлення споживачеві за його допомогою; споживач їх забирає (у цьому випадку ці повідомлення зникають з брокера). Як стара пошта для паперових листів (лише миттєво забирає та доставляє листи). Відправник кидає лист в поштову скриньку, а споживач забирає його зі своєї поштової скриньки. Найважливіше в цій аналогії те, що зв’язок є асинхронним, на відміну, наприклад, від вебхуків.
Цю штуку можна використовувати для черг.
Ви ж знаєте, як працювати з чергами, чи не так? Отже, на практиці RabbitMQ — це просто ще один драйвер черг. Його перевага полягає в тому, що інші програми зможуть бачити чергу. Тому RabbitMQ використовується для зв’язку між мікросервісами.
Що ж, ви вловили суть. Залишилося лише ознайомитися з деталями. Давайте перейдемо до них.
Найпростіший спосіб почати експериментувати з RabbitMQ у Laravel — це встановити його через Sail(по суті, Docker).
Додайте такі рядки до .env для RabbitMQ:
RABBITMQ_HOST=rabbitmq RABBITMQ_PORT=5672 RABBITMQ_USER=guest RABBITMQ_PASSWORD=guest RABBITMQ_VHOST="/" FORWARD_RABBITMQ_PORT=5672 RABBITMQ_QUEUE=rabbit_queue RABBITMQ_DELETE_ROUTING_KEY=file.delete RABBITMQ_DELETE_EXCHANGE=file.delete.exchange RABBITMQ_DELAY_ROUTING_KEY=file.delete.delay RABBITMQ_RETRY_AFTER=90
Виконайте в командному рядку:
composer require laravel/sail --dev
php artisan sail:install
Виберіть RabbitMQ у діалоговому вікні:

Рядки працюватимуть деякий час. Після того, як контейнери будуть зібрані, запустіть їх:
./vendor/bin/sail up
Кролик готовий для дослідів. Веб-інтерфейс RabbitMQ тепер доступний за адресою localhost:15672/. Створіть у ньому чергу rabbit_queue — стане в нагоді для наведеного нижче прикладу.
Тепер вам потрібно налагодити драйвер черги для RabbitMQ з репозиторію github.com/... ev/laravel-queue-rabbitmq. Цей репозиторій добре документований; дотримуйтеся його інструкцій.
Як можна передати повідомлення іншому застосунку Laravel? Я пропоную робочу схему.
Надсилання повідомлення
Ви можете створити job у програмі відправника (на початку має бути відкриваючий тег php — його не пропускає редактор):
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
class SendMessage implements ShouldQueue
{
use Queueable;
public function __construct(public readonly string $json) {}
public function handle(): void {}
}
Код для надсилання повідомлення:
$order = new stdClass;
$order->id = 4;
$order->amount = 23.87;
SendMessageJob::dispatch(json_encode($order))
->onQueue('rabbit_queue');
Я б помістив його в команду, щоб не створювати роутів, контролерів тощо (на початку має бути відкриваючий тег php — його не пропускає редактор):
namespace App\Console\Commands;
use App\Jobs\SendMessage as SendMessageJob;
use Illuminate\Console\Attributes\Description;
use Illuminate\Console\Attributes\Signature;
use Illuminate\Console\Command;
use stdClass;
#[Signature('app:send-message')]
#[Description('Send message to rabbitmq')]
class SendMessage extends Command
{
public function handle()
{
$order = new stdClass;
$order->id = 4;
$order->amount = 23.87;
SendMessageJob::dispatch(json_encode($order))->onQueue('rabbit_queue');
}
}
Тепер я надсилаю повідомлення командою:
./vendor/bin/sail artisan app:send-message
Примітка. Не запускайте воркери для черги rabbit_queue у застосунку відправника, інакше відправник забере це повідомлення з черги.
Отримання повідомлення
Додаток-отримувач повинен мати такі ж рядки у файлі .env для RabbitMQ, як і відправник. І для отримання повідомлень із черги rabbit_queue потрібно запустити воркер:
php artisan queue:work rabbitmq --queue=rabbit_queue
Ви створюєте job з такою ж назвою, як і у відправника (на початку має бути відкриваючий тег php — його не пропускає редактор):
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Illuminate\Support\Facades\Log;
class SendMessage implements ShouldQueue
{
use Queueable;
public function __construct(public readonly string $json) {}
public function handle(): void
{
Log::info('Received message: '.$this->json);
}
}
Результат тесту:

Отже, ми отримали JSON від відправника.
Сподіваюся, ви більше не боїтеся вакансій, які вимагають знання RabbitMQ.
Немає коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів