2016-05-10 3 views
5

ContexteComment créer un noeud final NServiceBus utilisant des transports différents?

Nous essayons d'introduire un nouveau modèle architectural dans notre entreprise et considérons CQRS avec Event Sourcing utilisant un bus de service. Technologies, nous développons actuellement notre POC avec NServiceBus, Event Store et MSMQ. Nous aimerions avoir un point de terminaison unique dans NServiceBus défini avec deux transports différents, MSMQ pour nos commandes et Event Store pour nos événements. L'état actuel de notre entreprise ne nous permet pas de facilement tout basculer vers Event Store, car nous avons investi massivement dans nos anciennes applications utilisant MSMQ, ce qui explique pourquoi nous envisageons l'approche hybride.

Question

Est-il possible de créer un seul point final NServiceBus qui utilise différents transports? Si oui, comment? Si non, quelles sont les alternatives?

Répondre

3

Aaron,

Je pense que la meilleure option serait d'utiliser MSMQ comme transport NServiceBus. Voici comment cela peut ressembler à:

  • envoyer une commande via MSMQ
  • dans un gestionnaire de commande (re) créer un agrégat qui est la cible de la commande
  • appeler les opérations
  • magasin résultant événements dans le magasin d'événements avec l'ID de message de la commande pour assurer l'idempotence. L'agrégat lui-même sera responsable de connaître les commandes qu'il a déjà traitées
  • dans un composant séparé (processeur d'événements) utiliser les API d'abonnement persistant EventStore pour se connecter à tous les événements flux. Certains de ces événements traités devraient provoquer l'envoi d'une commande. Une telle commande peut être envoyée via le noeud final NServiceBus send-only hébergé dans ce processeur d'événements .
  • Dans ce processeur d'événements vous pouvez également republier tous les événements via NServiceBus et MSMQ. Ces événements ne doivent pas être souscrites par d'autres services (voir la note sur l'autonomie ci-dessous)
  • NServiceBus Sagas (gestionnaires de processus) doivent vivre à l'intérieur de votre limite de service et de réagir sur les commandes et/ou des événements envoyés ou republié par ces processeurs d'événements sur MSMQ.

Une remarque concernant les limites de service est que vous devez décider quel niveau d'autonomie de service vous convient: * faible, où les services peuvent souscrire directement à d'autres flux d'événements de service. Dans cette conception, les événements qui traversent les limites de service sont évidemment autorisés à transporter des données. * Forte, où les services utilisent des événements de niveau supérieur pour la communication et ces événements portent uniquement l'identité des choses et aucune donnée. Si vous voulez quelque chose comme ceci, vous pouvez utiliser vos processeurs d'événements pour mapper des événements ES à ces événements de «niveau supérieur».

+0

Nous essayons d'utiliser NServiceBus Sagas dans notre implémentation. Comment incorporeriez-vous Sagas dans votre réponse? –

+0

J'ai édité ma réponse pour inclure Sagas. –

+0

Merci Szymon. Notre implémentation idéale serait que NServiceBus connaisse le modèle CQRS et soit capable de partager les transports basés sur la commande (MSMQ) et l'événement (Event Store).Votre idée d'utiliser des processeurs événementiels pour mapper du magasin d'événements à des événements de niveau supérieur est une possibilité, mais ne semble pas très bien convenir à notre scénario idéal. Nous avons également considéré NCQRS comme une alternative possible à NServiceBus, mais ce projet n'a pas l'air bien entretenu. Nous pourrions finir par mettre en place les nôtres. =) –