Sur la base de ce que j'ai compris sur la cohérence éventuelle, tous ces services (consommateurs) recevront l'événement en même temps et les traiteront séparément, ce qui, dans un bon scénario, conduira à la cohérence des données.
Non pas forcément. Comme je l'ai commenté, nous ne pouvons pas annuler un e-mail envoyé, nous avons donc encore besoin d'une sorte de "séquence". IPC sur gestion des données événementiel n'est pas exempte d'orchestation 1 .
Par exemple, l'e-mail ne doit pas être envoyé à moins que les transactions précédentes ne se terminent avec succès et que le service de messagerie n'en obtienne une preuve. 3
Cependant, que se passe-t-il si un service ne parvient pas à traiter l'événement? par exemple, déconnexion soudaine, erreur de base de données, etc. Quel est un bon modèle / pratique pour gérer ces échecs de transaction?
Dites bonjour aux erreurs de l'informatique distribuée . Ce sont eux qui compliquent les choses et, comme d'habitude, il n'y a pas de balles d'argent pour y faire face.
Avant de commencer notre voyage à la recherche de l'Arche perdue, nous devons d'abord demander à l'organisation. Souvent, la solution réside dans la façon dont l'organisation fait face à ces problèmes dans le monde réel .
Que fait tout le monde (départements) lorsque certaines données sont manquantes ou incomplètes?
Nous nous rendrons compte que les différents services ont des solutions différentes qui, ensemble, constituent la solution à mettre en œuvre.
Quoi qu'il en soit, voici quelques pratiques qui pourraient nous aider dans la stratégie à suivre.
Plutôt que de veiller à ce que le système soit constamment dans un état cohérent, nous pouvons plutôt accepter que le système l'obtiendra à un moment donné dans le futur. Cette approche est particulièrement utile pour les opérations commerciales de longue durée.
La façon dont le système atteint la cohérence varie d'un système à l'autre. Cela peut impliquer des processus automatisés à une sorte d'intervention humaine. Par exemple, le réessayer typique plus tard ou le contact avec le service client .
Annuler toutes les opérations
Remettez le système dans un état cohérent via des transactions compensatoires . Cependant, nous devons tenir compte du fait que ces transactions peuvent également échouer, ce qui pourrait nous conduire à un point où l'incohérence est encore plus difficile à résoudre. Et, encore une fois, nous ne pouvons pas annuler un e-mail envoyé.
Pour un faible nombre de transactions, cette approche est faisable, car le nombre de transactions compensatoires est également faible. S'il y avait plusieurs transactions commerciales impliquées dans la CIB, le traitement d'une transaction compensatoire pour chacune d'entre elles serait difficile.
Si nous optons pour des transactions compensatoires , nous trouverons que le modèle de conception des disjoncteurs est très utile - et obligatoire j'oserais dire -
Transactions distribuées
L'idée est de couvrir plusieurs transactions au sein d'une même transaction, via un processus de gouvernance global appelé Transaction Manager . Un algorithme courant pour gérer les transactions distribuées est la validation en deux phases .
La principale préoccupation des transactions distribuées est qu'elles reposent sur le verrouillage des ressources pendant sa durée de vie, et comme nous le savons, les choses peuvent mal tourner pour le gestionnaire de transactions .
Si les gestionnaires de transactions sont compromis, nous pouvons nous retrouver avec plusieurs verrous dans les différents contextes limités, ce qui entraîne des comportements inattendus en raison de la mise en file d'attente des messages. 2
Opérations de décomposition. Pourquoi?
Si vous décomposez un système existant et que vous trouvez une collection de concepts qui veulent vraiment être dans une seule frontière de transaction, laissez-les peut-être pour la fin.
Sam Newman
En accord avec les arguments ci-dessus, Sam - dans son livre Building Microservices - déclare que, si nous ne pouvons vraiment pas vraiment nous permettre la cohérence éventuelle, nous devons éviter de diviser l'opération maintenant.
Si nous ne pouvons pas nous permettre de scinder certaines opérations en deux ou plusieurs transactions, cela pourrait dire que - probablement - ces transactions appartiennent au même contexte délimité, ou - au moins - à un contexte transversal qui reste à modéliser.
Par exemple, dans notre cas, nous nous rendons compte que les transactions # 1 et # 2 sont étroitement liées l'une à l'autre et probablement les deux pourraient appartenir au même contexte délimité Comptes , Utilisateurs , Registre , peu importe ...
Pensez à placer les deux opérations dans les limites de la même transaction. Cela rendrait l'opération plus facile à gérer. Évaluez également le niveau de criticité de chaque transaction. Probablement, si la transaction # 2 échoue, elle ne devrait pas compromettre toute l'opération. En cas de doute, demandez à l' organisation .
1: Pas le genre d'orchestration que vous pensez. Je ne parle pas de l'orchestation d'ESB. Je parle de faire réagir les services à l'événement approprié.
2: Vous pourriez trouver les opinions intéressantes de Sam Newman concernant les transactions distribuées.
3: Consultez la réponse de David Parker à ce sujet.