Что такое Symfony messenger
Прежде чем приступить к изучению этого материала, рекомендую ознакомиться с моим видео о том, что такое очереди сообщений и зачем они нужны. Ссылка на это видео здесь:
https://webkyrs.info/page/zachem-nuzhni-ocheredi-soobschenii-v-programmirovanii-i-chto-eto-takoe
Так вот, symfony messenger - это всего лишь php пакет для composer, который позволяет работать с очередями сообщений на Symfony проще и быстрее.
Эта заметка для того, чтобы у вас появилось вводное представление, что собой представляет этот инструмент.
Более подробнее познакомиться с Symfony messenger можно в этом видеокурсе:
https://webkyrs.info/category/symfony-messenger-rabota-s-ocherediami-soobshchenii
Нужно понимать, что вы можете написать очередь сообщений и самостоятельно, просто с помощью готового пакета настроить все проще и быстрее.
Но, тем не менее, здесь у нас также появляются недостатки в виде того, что получаем ограничения этого пакета и ограничение его возможностями. Мы вынуждены соблюдать правила этого пакета.
В итоге, от использования Symfony messenger мы получаем как плюсы, так и минусы.
Для чего нужен messenger?
Итак, основная задача этого пакета - организовать программную прослойку между брокером сообщений, которым может выступать база данных, Redis, Rabbit MQ и др. и вашим программным кодом.
Задача messenger обеспечить доставку сообщений до брокера сообщений и связать обработку этих сообщений с соответствующим обработчиком.
Таким образом, messenger - это не какая-то конкретная реализация брокера сообщений, а инструментарий для связи программного кода с брокером сообщений.
Установка
Установка здесь достаточно простая. Мы просто устанавливаем дополнительный пакет с помощью пакетного менеджера composer в свой проект
composer require symfony/messenger
После установки нам придется взаимодействовать с рядом составных частей этого пакета, о которых мы сейчас с вами и поговорим.
Что такое Message
В Symfony Messenger Message - это просто PHP-объект, который содержит данные, которые обработчик сообщений будет использовать. Это может быть что угодно, от простого текстового сообщения до сложной структуры данных.
Обычно объекты сообщений несут какие-то данные, но также могут содержать служебную информацию, например, о том, как обрабатывать это сообщение (например, имя сервиса или команды).
Как правило, сообщения создаются в папке src/Message.
Вот пример простого сообщения:
// src/Message/EmailNotification.php
namespace App\Message;
class EmailNotification
{
public function __construct(
private string $post_id
) {
}
public function getPostId(): string
{
return $this->post_id;
}
}В этом сообщении мы храним информацию об id той записи, которую нужно обработать.
Добавление сообщения в очередь
Для того, чтобы сообщение попало в очередь, мы с вами должны воспользоваться методом dispatch для специального сервиса MessageBus (это сервис доставки сообщений в очередь).
Предварительно создаем экземпляр класса сообщения и добавляем его в очередь. Выглядеть это может примерно так:
use App\Message\EmailNotification;
use Symfony\Component\Messenger\MessageBusInterface;
class SomeController
{
private $messageBus;
public function __construct(MessageBusInterface $messageBus)
{
$this->messageBus = $messageBus;
}
public function someAction()
{
// Создаем объект сообщения
$message = new EmailNotification('123');
// Отправляем сообщение в очередь
$this->messageBus->dispatch($message);
// Другие действия...
}
}Что такое Message Handler
Для того, чтобы обрабатывать сообщения, которые будут добавляться в очередь, мы с вами должны написать специальный PHP-класс (сервис) в котором будет прописана логика обработки сообщений добавленных в очередь.
Как правило, такие классы создаются в отдельной папке src/MessageHandler.
Выглядеть это может следующим образом:
// src/MessageHandler/EmailNotificationHandler.php
namespace App\MessageHandler;
use App\Message\EmailNotification;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
class EmailNotificationHandler implements MessageHandlerInterface
{
public function __invoke(EmailNotification $message)
{
// Здесь вы можете добавить логику для обработки сообщения
// Например, отправка электронной почты
$postId = $message->getPostId();
// Логика обработки сообщения...
// Например, отправка электронной почты
// mail($message->getRecipient(), $message->getSubject(), $message->getContent());
// Пример логирования обработки сообщения
// $logger->info('Email notification sent for post with ID ' . $postId);
}
}Что такое worker
Но, написанный обработчик сообщений не запустится сам по себе. Чтобы это произошло у нас должна быть запущена и постоянно включена специальная служба, которая будет контролировать поступление сообщений в очередь и как только сообщение поступает в очередь, оно связывается с соответствующим обработчиком и запускается php скрипт, который выполнит действия описанные в message handler.
Если мы говорим про development разработку, эта служба может запускаться командой:
php bin/console messenger:consume async
Эта команда запускает worker, который будет непрерывно получать сообщения из очереди с именем async.
Если мы говорим про production сервер, то там обработка сообщений, как правило, настраивается через службу supervisor, которая следит, чтобы наш worker был постоянно включен.
Что такое транспорт
Транспорт в Symfony Messenger - это механизм, который определяет, как сообщения будут доставлены до обработчиков. Symfony поддерживает различные транспорты, такие как AMQP (RabbitMQ), Redis, Doctrine и др.
В конфигурационных файлах мы с вами прописываем в какой транспорт будет добавляться то или иное сообщение и кто его должен обработать.
Заключение
В общих чертах, мы с вами познакомились с Symfony messenger, но это лишь малая часть из того, что нужно знать, чтобы полноценно начать использовать его в своих проектах.
Более подробно о других особенностях вы можете посмотреть в моем видеокурсе по работе с этим инструментом.
https://webkyrs.info/category/symfony-messenger-rabota-s-ocherediami-soobshchenii
Надеюсь, что после прочтения этой записи общее представление о работе пакета messenger в Symfony у вас появилось.