У нас есть проект, который частично использует 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: (