polyanin
@polyanin
PHP Symfony & Golang developer

Где лучше посмотреть реальные кейсы использования RabbitMQ с примерами кода, в идеале на GO или PHP?

Приветствую!
Интересуют реальные кейсы использования RabbitMQ с примерами кода, в идеале на GO или PHP.
Изучаю вопрос. Нужно на чем-то поучиться, посмотреть, как правильно. Мастер-класс.
Сабж будет использоваться в проекте. Надо подучиться.
  • Вопрос задан
  • 606 просмотров
Пригласить эксперта
Ответы на вопрос 2
tommy-vercetti
@tommy-vercetti
Symfony/Golang
Реальные кейсы использования можно посмотреть только на "реальных" проектах. Никто не выкладывает коммерческие проекты на всеобщее обозрение. Мы используем RabbitMQ с компонентом Symfony Messenger для следующих сценариев.

  • SMS/Email сообщения
  • Кропы фото. Сначала фотку загружаем в сторадж GCS. Затем отправляем сообщение в RabbitMQ, где мы из GCS скачиваем на локальный диск, кропим и грузим обратно GCS.
  • Удаление старых файлов: фото, pdf-ки и тд при изменении профайла или при перегенерации инвойса
  • Тяжелые операции, которые могут блокировать респонс. Различные обращения к сторонним API: создание профиля в платежной системе, в salesforce при регистрации.

Вот простой пример. Мы создаем сущность миссии и рассылаем уведомления менеджерам и part-time employee, находящимся недалеко от места создания миссии. Далее у нас есть 2 воркера (async_new_mission_area_notification_to_manager и async_new_mission_notification_to_part_time_employee), которые слушают это событие.

namespace App\Domain\Mission;

class Mission implements ToArrayTransformable, RaiseEventsInterface
{
    public function __construct(/* ... */)
    {
        // ...

        $this->initUuid();

        $this->raise(new MissionCreatedEvent($this->getUuidString()));
    }
}

namespace App\Application\Bus\MessageHandler\Event\Mission;

class SendNewMissionAreaNotificationToManager implements MessageSubscriberInterface
{
    private MissionRepositoryInterface $missionRepository;

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

    public function __invoke(MissionCreatedEvent $event): void
    {
        $mission = $this->missionRepository->getOneByCriteria(new MatchingUuidCriteria($event->getMissionUuid()));

        if (!$mission instanceof Mission) {
            return;
        }

        // Здесь уже ищем нужных менеджеров и рассылаем им уведомления
    }

    public static function getHandledMessages(): iterable
    {
        yield MissionCreatedEvent::class => [
            'from_transport' => 'async_new_mission_area_notification_to_manager',
        ];
    }
}

namespace App\Application\Bus\MessageHandler\Event\Mission;

class SendNewMissionNotificationToPartTimeEmployeeHandler implements MessageSubscriberInterface
{
    private MissionRepositoryInterface $missionRepository;

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

    public function __invoke(MissionCreatedEvent $event): void
    {
        $mission = $this->missionRepository->getOneByCriteria(new MatchingUuidCriteria($event->getMissionUuid()));

        if (!$mission instanceof Mission) {
            return;
        }

        // Рассылаем уведомления подходящим part-time employee
    }

    public static function getHandledMessages(): iterable
    {
        yield MissionCreatedEvent::class => [
            'from_transport' => 'async_new_mission_notification_to_part_time_employee',
        ];
    }
}

Если не заходит Symfony Messenger, то могу посоветовать SwarrotBundle с odolbeau/rabbit-mq-admin-toolkit.
Ответ написан
PavelUstyugov
@PavelUstyugov
proger support
есть такой человек "Елисеев" у него Ютуб канал и там про Rabbit есть.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы