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

    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.
    Ответ написан
  • Проблема с обновлением данных в Symfony и очередью сообщений, как решить?

    tommy-vercetti
    @tommy-vercetti
    Symfony/Golang
    Нужно почистить entity manager и разорвать соединение с базой в Consumer'е после сохранения данных:

    // Сохранили в базу
    $this->em->flush();
    
    $this->em->clear();
    $this->em->getConnection()->close();
    Ответ написан