Как настроить Symfony Messenger для работы с topi c exchange? - PullRequest
1 голос
/ 11 марта 2020

У нас есть проект, который частично использует DDD. При изменении / создании объекта мы добавляем событие внутрь объекта. Затем подписчик событий Doctrine берет все события и перенаправляет их в EventBus.

Допустим, у нас есть событие MissionCreatedEvent. Я хочу сделать ключ маршрутизации mission.event.created для него и t ie его в 2 очереди: new_mission_notification_to_part_time_employee и new_mission_area_notification_to_manager.

Вот как выглядит конфигурация:

transports:
    async_new_mission_notification_to_part_time_employee:
        dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
        options:
            exchange:
                name: mission
                type: topic
            queues:
                new_mission_notification_to_part_time_employee:
                    binding_keys: ['mission.event.created']
        retry_strategy:
            max_retries: 0

    async_new_mission_area_notification_to_manager:
        dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
        options:
            exchange:
                name: mission
                type: topic
            queues:
                new_mission_area_notification_to_manager:
                    binding_keys: ['mission.event.created']
        retry_strategy:
            max_retries: 0

routing:
    'App\Domain\Mission\Event\MissionCreatedEvent':
        - async_new_mission_notification_to_part_time_employee
        - async_new_mission_area_notification_to_manager

Проблема в том, что Symfony Messenger сначала запускается на транспортных средствах, а только затем отправляет сообщение в обмен. Поскольку у нас есть 2 транспорта, получается, что событие с ключом маршрутизации mission.event.created запускается дважды. Из-за этого мои обработчики сообщений запускаются 2 раза.

Существует возможность не использовать ключ маршрутизации mission.event.created. Но используйте аналогичные mission.cmd.notify_part_time_employee_about_new_mission и mission.cmd.notify_manager_about_new_mission_in_area для каждого транспорта с прямым обменом.

Это поможет решить проблемы с дублированием, но я не могу использовать все функции, которые предоставляет мне RabbitMQ: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...