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.

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось3
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Підписатись на коментарі