J'ai récemment commencé à plonger dans CQRS / ES parce que je pourrais avoir besoin de l'appliquer au travail. Cela semble très prometteur dans notre cas, car cela résoudrait beaucoup de problèmes.
J'ai esquissé ma compréhension approximative de l'apparence contextuelle d'une application ES / CQRS dans un cas d'utilisation bancaire simplifié (retrait d'argent).
Pour résumer, si la personne A retire de l'argent:
- une commande est émise
- la commande est remise pour validation / vérification
- un événement est poussé vers un magasin d'événements si la validation réussit
- un agrégateur retire l'événement pour appliquer des modifications à l'agrégat
D'après ce que j'ai compris, le journal des événements est la source de la vérité, comme c'est le journal des FAITS, nous pouvons alors en tirer toute projection.
Maintenant, ce que je ne comprends pas, dans ce grand schéma des choses, c'est ce qui se passe dans ce cas:
- règle: un solde ne peut pas être négatif
- la personne A a un solde de 100e
- la personne A émet une commande de retrait de 100e
- passe de validation et l'événement MoneyWithdrewEvent of 100e est émis
- en attendant, la personne A émet une autre commande de retrait de 100e
- le premier MoneyWithdrewEvent n'a pas encore été agrégé, donc la validation passe, car la vérification de validation par rapport à l'agrégat (qui n'a pas encore été mise à jour)
- MoneyWithdrewEvent of 100e est émis une autre fois
==> Nous sommes dans un état incohérent d'un solde étant à -100e et le journal contient 2 MoneyWithdrewEvent
Si je comprends bien, il existe plusieurs stratégies pour faire face à ce problème:
- a) mettre l'id de version agrégée avec l'événement dans le magasin d'événements, donc s'il y a une incompatibilité de version lors de la modification, rien ne se passe
- b) utiliser certaines stratégies de verrouillage, ce qui implique que la couche de vérification doit en créer une
Questions liées aux stratégies:
- a) Dans ce cas, le journal des événements n'est plus la source de la vérité, comment y faire face? De plus, nous sommes revenus au client OK alors que c'était totalement faux de permettre le retrait, est-il préférable dans ce cas d'utiliser des serrures?
- b) Locks == deadlocks, avez-vous une idée des meilleures pratiques?
Dans l'ensemble, ma compréhension est-elle correcte sur la façon de gérer la concurrence?
Remarque: je comprends que la même personne qui retire deux fois de l'argent dans un laps de temps aussi court est impossible, mais j'ai pris un exemple simple, pour ne pas se perdre dans les détails