Архитектура, управляемая событиями, для сервисов с несколькими экземплярами

В нашем проекте мы используем микросервисную архитектуру. Мы развертываем каждую службу в кластере с помощью Kubernetes. Службы разрабатываются с использованием языка программирования Java и среды Spring Boot. Для каждой службы существует три реплики. Сервисы общаются друг с другом, используя только события. RabbitMQ используется как очередь сообщений. Одна из служб используется для отправки электронного письма. Детали электронного письма предоставляются другой службой с событием. Когда событие SendingEmail публикуется службой, три реплики почтовой службы используют событие, и одно и то же электронное письмо отправляется три раза. Как я могу предотвратить отправку писем двумя другими службами?


person ugur    schedule 24.06.2019    source источник
comment
Какой тип обмена вы используете для публикации мероприятия? Похоже, вы используете fanout exchange. Вероятно, вы сможете решить свою проблему, если воспользуетесь прямым обменом. вместо. Это гарантирует, что сообщение получит только один из них.   -  person Edwin Dalorzo    schedule 29.06.2019


Ответы (1)


Я думаю, это зависит от того, как вы работаете с Rabbit MQ.

Вы можете настроить rabbit mq с одной очередью для этих событий и сделать приложения весенней загрузки, которые представляют отправляющие серверы как «конкурирующие» потребители.

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

Из того, что вы описали, все они получают сообщение, поэтому он работает как pub-sub (что также является возможным способом работы с rabbit mq, в данном случае это просто не очень хорошо).

person Mark Bramnik    schedule 24.06.2019
comment
Как я могу спроектировать, что только определенные события потребляются одним экземпляром? Может быть, всем экземплярам нужны другие события. - person ugur; 24.06.2019
comment
Вы должны прочитать о различных типах обмена и ключах маршрутизации в rabbit mq. Его чрезвычайно гибкий. В общем, вы можете произвести обмен для дублирования сообщения в N очередях (N = количество экземпляров в реплике), и каждая очередь будет иметь одного потребителя = ›это pub-sub, вероятно, то, что у вас есть сейчас. В качестве альтернативы вы можете настроить обмен для отправки только в одну очередь, и все повторные реплики будут конкурирующими потребителями в этой очереди. В этом случае сообщение будет получать только один потребитель. - person Mark Bramnik; 24.06.2019