2017-08-14 5 views
0

J'utilise des micro services, supposons que j'ai 3 services et qu'ils soient tous connectés via un canal JGroup UDP (JGroups peuvent diffuser des messages entre eux):Message de diffusion dans microservices et exécutez-le une fois dans plusieurs instances

---   --- --- 
| A | --msg--> | B || C | 
---   --- --- 

Si je n'ai qu'une instance de chaque service, tout va bien. Mais par exemple, si j'ai deux instances de service C, les deux recevront l'événement et les deux exécuteront leur propre procédure et le résultat sera dupliqué dans la base de données (somme de la valeur deux fois).

---   --- --- --- 
| A | --msg--> | B || C || C | 
---   --- --- --- 

Est-il possible de gérer cela?

Répondre

2

Créer une file d'attente séparée pour chaque Microservice (sinon déjà créé)

Dans Lapin MQ, utilisez Fanout échange donc chaque file d'attente sera reacieve tous les messages.

Maintenant, si plusieurs instances d'un seul microservice sont liées à la même file d'attente, une seule instance sera en mesure de sélectionner un message dans cette file d'attente.

0

Si vous ne pouvez pas utiliser un service supplémentaire comme RabbitMQ, ajoutez l'ID de l'hôte (quelle instance C) dans l'en-tête du message avant de diffuser. Les instances C vérifient l'en-tête, si son identifiant est présent dans l'en-tête qu'il va traiter.

Ce mécanisme nécessite que chaque instance dispose d'informations précises sur les autres instances en cours d'exécution.

Vous pouvez encore améliorer l'équilibrage de charge entre instances C.