2017-08-08 1 views
0

Nous sommes sur le point d'abandonner l'ES parce que nous avons besoin de modèles de lecture cohérents pour les processus et, tout en essayant de comprendre comment nous pourrions économiser ES, nous avons pensé à une lecture cohérente. Fondamentalement, une commande serait exécutée par un AR, générant la liste des événements. Ces événements seraient d'abord enregistrés dans le magasin d'événements, puis (à travers un certain codage supplémentaire) exclusivement au modèle de lecture (de manière transactionnelle, İ.A. toutes les projections pour tous les événements d'une seule commande seraient enveloppés dans une transaction). Ce n'est qu'après que les événements seront publiés. Donc, fondamentalement, mon code serait comme:Event Sourcing sans cohérence éventuelle?

void ExecuteCommand(Command cmd) { 
    // validate and stuff... 
    var events = GenerateEvents(cmd); 
    PersistAllSync(events); 
    ApplyProjectionsSync(events); 
    PublishAsync(events) 
} 

Outre les problèmes évidents de performance (type de transactions distribuées, sérialisation bascially toutes les commandes) ... pourquoi personne ne fait ça?

+0

Cela peut devenir incohérent en présence d'erreurs. Par exemple, dites que 'ApplyProjectionsSync' réussit, mais que' PublishAsync' échoue. Cela créera une situation où le modèle de lecture a les modifications, mais les événements ne sont pas dans le flux. –

+0

Vous devriez probablement préciser ce que cela signifie; _needing_ compatible read models est en fait assez inhabituel. Le fait de croire que vous avez besoin d'être cohérent quand vous ne le faites pas est assez commun. – VoiceOfUnreason

+0

@Lev pouvez-vous expliquer pourquoi vous avez besoin d'une vue cohérente, s'il vous plaît? Seulement savoir pourquoi nous pouvons trouver le moyen de le faire avec l'approvisionnement d'événements ... – Narvalex

Répondre

0

Je ne suis pas un expert mais je peux essayer d'y répondre de toute façon.

Pour obtenir une cohérence transactionnelle, je groupais des événements (dans le même périmètre d'agrégat/de transaction) et les appliquais tous atomiquement à mes modèles lus. Et je publie également des événements regroupés dans des transactions. Cela fonctionne bien pour moi, donc c'est certainement possible.

Afin d'éviter une éventuelle cohérence dans les modèles de lecture locaux (pour que je puisse retourner état nouveau et cohérent dans la commande-réponse) Je demande également des événements au niveau local dans la transaction. Tant que vous n'avez pas trop de modèles à lire, je suppose que cela ne devrait pas poser de problème. Vous pouvez avoir ceci pour certains modèles de lecture qui doivent être mis à jour et consolider et gérer le reste de la manière "normale" si vous le souhaitez.