2010-11-21 4 views
9

Lorsque les snapshots d'agrégats ne sont plus synchronisés avec le journal des événements, je peux simplement rejouer mes événements à partir des instantanés précoces (qui sont censés être synchronisés). La même chose que je peux faire quand j'ajoute/enlève de nouveaux champs ou quand je modifie la logique des gestionnaires existants.Comment gérer les situations, lorsque le modèle de lecture est devenu désynchronisé avec les journaux d'événements?

Dans le cas où j'ai besoin d'ajouter un nouveau modèle de lecture (c'est-à-dire une nouvelle vue de rapport) je peux faire la même chose - je rejouerai mes événements.

Mais comment dois-je gérer la situation, lorsque le modèle de lecture est devenu désynchronisé avec le journal des événements? Le stockage des événements et la publication sont dans une transaction, mais la mise à jour du modèle de lecture a eu lieu dans une autre transaction, qui peut échouer. Répéter les événements depuis le début peut aider, mais cela peut prendre l'éternité. Ai-je besoin d'un concept d'instantanés pour l'ensemble du modèle de lecture?

Comment résolvez-vous ce problème? Merci.

Répondre

7

Quelle serait la raison de l'échec du gestionnaire d'événements? Quelle est la durée de "l'éternité"? Les mises à jour du modèle en lecture échouent rarement (contrairement aux gestionnaires de commandes), car la logique à l'intérieur est extrêmement simple. Les pannes sont susceptibles d'être causées par des problèmes transitoires (E/S) et seront traitées automatiquement par le bus de messages. Toutefois, si le modèle de lecture est corrompu pour une raison quelconque, il est le moyen le plus simple de le réinitialiser et de diffuser des événements. Même des millions d'événements prendraient raisonnablement peu de temps. De plus, vous pouvez toujours utiliser l'approche Map-Reduce.

Je recommanderais de ne pas introduire d'instantanés pour lire les modèles. Je pense que cela ne fait que compliquer l'architecture sans gains significatifs.

+1

Merci Rinat! En cas de répétition d'événements depuis le début, utilisez-vous un thread de gestionnaires d'événements? Parce que dans le cas où je vais utiliser plusieurs threads de travail, je peux recevoir des résultats incorrects (alors qu'il fonctionnera en production en raison de la nature du domaine - les conditions de concurrence de plusieurs événements ne sont pas possibles lors de la publication d'utilisateurs réels pour plusieurs threads de travail). Reconnaît-il globalement que nous devrions utiliser un seul thread de travail pour traiter les événements depuis le début? Merci pour vos précieuses réponses. –

+0

Bon appel. Je préfère éviter de tels problèmes de concurrence en n'exécutant jamais plus de 1 thread par instance d'entité (soit des commandes, soit des événements). Nous pouvons donc avoir plusieurs threads pour les gestionnaires d'événements, cependant chaque single view * instance * (identifié par une identité) ne sera toujours traité que par un seul thread. Bien sûr, un thread peut gérer plusieurs instances ou types de vue à la fois. est-ce que cela aide? –

+0

Merci! Après quelques jours d'analyse de votre réponse, je pense que je comprends la mécanique de la gestion des événements avec plusieurs threads de travail. J'apprécie vos réponses. –

Questions connexes