Validation de l'unicité lors de l'utilisation du CQRS et de l'Event sourcing

j'essaie de mettre en œuvre ma propre infrastructure CQRS avec Event Sourcing pour mieux l'apprendre. Comme un exemple de projet, je suis la mise en œuvre d'un moteur de blog, je sais qu'il pourrait ne pas être une parfaite adéquation, mais je veux juste travailler sur quelque chose de réel.

le problème que j'ai maintenant est la validation. Chaque message a un shortUrl , et le shortUrl devrait être unique, mais où devrais-je mettre cette validation dans le domaine? Je sais que j'aurai cette validation avant même d'envoyer le commande en lisant dans mon magasin de lecture pour vérifier si elle est valide lors de la création d'une commande create post ou update post.

je peux penser à deux"solutions".

  1. Avoir une Blog agrégat garder des traces de tout blog paramètres liés et également des références à tous les postes. Mais le problème à mes yeux est que je dois gérer la communication entre les agrégats dans ce scénario ainsi que chaque fois que j'ai besoin de valider la l'unicité d'un shortUrl j'ai besoin de lire tous les événements de la manifestation magasin pour créer tous les posts et qui semble compliqué.
  2. la deuxième alternative que j'ai est quand l'événement est lancé et mon gestionnaire d'événements qui crée le modèle de lecture lance un événement d'url courte dupliqué quand il remarque qu'il aura deux URL courtes qui pointent vers des postes différents. Est-il valide d'avoir le modèle read pour déclencher des événements quand il détecte des erreurs?

y a-t-il d'autres alternatives? Notez que je sais que mon domaine pourrait ne pas être le meilleur adapté pour cqrs et DDD, mais je le fais pour apprendre dans un petit domaine.

18
demandé sur ataddeini 2012-02-26 21:26:09
la source

3 ответов

j'opterais pour un service de domaine qui est simplement responsable de générer des ShortURL uniques. Vous pouvez utiliser un DB transactionnel pour mettre en œuvre ce comportement. En général, ce service serait utilisé par la partie gestion de la commande de L'agrégat BlogPost. S'il y a un ShortURL dupliqué, vous pouvez lancer un Duplicateurrorevent. Vous pouvez pré-attraper ceci dans L'UI (mais jamais 100%) en créant un thin query-model en utilisant la même source de données, de sorte que vous pouvez demander si une URL raccourcie est unique avant de soumettre le post (comme décrit par la réponse de @RyanR).

1
répondu Pepster 2015-11-30 13:34:00
la source

Cela dépend de ce que l'industrie veut arriver. Si vous voulez que le client (créateur des commandes) soit responsable du choix d'une URL courte, il devrait avoir un magasin de lecture qu'il vérifie l'unicité de celui-ci. Lorsque l'utilisateur tape dans une URL courte, la vue devrait vérifier que L'URL courte est unique et présenter une erreur de validation si elle ne l'est pas. Chaque fois qu'un message est enregistré, un événement publie les informations mises à jour (y compris L'URL courte) qui maintient le magasin de lecture en synchronisation.

0
répondu RyanR 2012-02-26 21:32:53
la source

j'ai lu les différentes réponses à cette question et à la question connexe.

la décision se résume à la décision correcte. Si vous pouvez être indulgente et accepter un comportement imparfait pour un certain degré d'une opération, votre problème est beaucoup plus simple à résoudre, en particulier sous de faibles garanties de cohérence.

cependant, si vous voulez de la cohérence, vous devez utiliser un service de persistance qui a de fortes garanties de cohérence.

pour par exemple, la commande qui crée L'URL courte validera que le store de lecture ne contient pas déjà une URL aussi courte et nous ne propagerons notre événement que si nous pouvons propager les modifications à notre store de lecture en premier.

si nous pouvons engager nos modifications dans notre magasin de lecture, nous n'avons violé aucune contrainte d'unicité (en supposant que votre magasin de lecture applique une telle contrainte) et nous pouvons alors procéder.

cependant, puisque nous avons deux transactions non nécessairement sur la même base de données que nous pourrions échouer après la première validation. C'est OK parce que l'opération dans son ensemble échouera également. La lecture de la boutique sera de refléter un état incohérent pour un certain temps, mais dès que nous réparation le total la lecture de la boutique sera de retour dans un état cohérent.

comme procédure d'entretien, nous pourrions périodiquement réparer des agrégats qui ont été sujets à des erreurs potentielles. Et vous pouvez le faire en introduisant une erreur drapeau qui est autorisé si les deux opérations s'engager avec succès.

il y avait un exemple où une banque permettait à un utilisateur de retirer des fonds de son compte parce qu'il y avait des surtaxes pour compenser. Cela soulève des questions parce qu'il semblerait bâclé de résoudre un problème comme celui-là, même paresseux. Certains appellent à puce. Je ne sais pas quoi penser. La banque a probablement assez d'argent pour le couvrir, alors ils pourraient aussi bien l'ignorer, mais ce n'est pas comme ça que le monde fonctionne actuellement. De toute façon, je m'égare.

D'un point de vue d'exactitude, notre magasin de lecture a une forte garantie de cohérence et nous écririons notre projection d'une telle manière que nous ne pouvons pas engager une transaction au magasin de lecture si le solde est mis dans le négatif. En tant que telle la pire chose qui puisse arriver est qu'une charge est déduite du magasin de lecture mais l'opération n'a jamais été pleinement engagée dans le magasin d'événement. L'utilisateur verrait de l'argent manquant de son compte jusqu'à la maintenance procédure remarqué le drapeau d'erreur et guéri le compte. Je pense que c'est un compromis qui fonctionne.

0
répondu John Leidegren 2017-04-26 10:58:26
la source

Autres questions sur