2012-11-21 4 views
22

Comme je l'ai appris dans Why is the CQRS repository publishing events, not the event store?, c'est la tâche du référentiel CQRS de publier des événements. Jusqu'ici tout va bien.CQRS: Stocker des événements et les publier - comment le faire en toute sécurité?

Bien sûr, le stockage des événements et leur publication doivent se faire en une seule transaction. Techniquement, cela signifie écrire un (ou plusieurs) enregistrements dans le magasin et publier un (ou plusieurs) événement (s) sur un bus de messages. Par conséquent, une simple transaction de base de données ne suffit pas, elle devrait être distribuée.

Désormais, malheureusement, de nombreuses bases de données NoSQL (telles que MongoDB) ne prennent pas en charge les transactions compatibles ACID, même pas pour parler de la possibilité d'avoir lieu dans une transaction distribuée. De plus, il existe des files d'attente de messages qui ne prennent pas en charge les transactions distribuées. Donc, la question est: Comment faire face à cela?

Y a-t-il un modèle recommandé à utiliser?

Répondre

21

Votre référentiel peut publier des événements, il n'est pas nécessaire. La solution dans ce cas consiste à utiliser le magasin d'événements en tant que file d'attente. Vous auriez un processus d'arrière-plan qui surveille le magasin d'événements pour les nouveaux événements, les publie (par exemple) sur un bus, puis les marque comme expédiés.

Comme toujours, il y a des compromis. Vous aurez probablement à faire face à au moins une fois la messagerie et le traitement idempotent. C'est plus complexe que d'utiliser une simple transaction distribuée.

Jonathan Oliver a écrit plusieurs messages sur ce sujet qui pourraient vous aider: Removing 2PC, How I Avoid Two-Phase Commit, Idempotency Patterns

+0

Merci de remarquer ces articles sur :-) –

+1

+1 pour une grande explication –

+1

Merci pour cela - incroyablement utile. En ce qui concerne la surveillance du magasin d'événements - comment pourrait-on accomplir cela sans sondage? Existe-t-il un mécanisme plus réactif pour le faire sans introduire le 2PC? – CraigM

Questions connexes