Après avoir fait un peu plus de recherche, je suis tombé sur cet article dont j'ai tiré quelques citations qui je pense sont utiles pour ce que je veux accomplir (et pour tous les futurs lecteurs). Cela offre un moyen d'adopter un modèle de programmation réactive par rapport à un modèle de programmation impératif.
Recherche d'événements
L'idée ici est de représenter la transition d'état de chaque application sous la forme d'un événement immuable. Les événements sont ensuite stockés sous forme de journal ou de journal au fur et à mesure qu'ils se produisent (également appelés «magasin d'événements»). Ils peuvent également être interrogés et stockés indéfiniment, dans le but de représenter comment l'état de l'application, dans son ensemble, a évolué au fil du temps.
Ce que cela permet d'accomplir, c'est que si un microservice tombe en panne et que d'autres événements qui le concernent sont publiés et que les événements sont consommés par, par exemple, d'autres instances de ce microservice, lorsque ce microservice revient, il peut s'y référer event store
pour récupérer tous les événements qu'il a manqués au cours de la période où il est tombé.
Apache Kafka en tant que courtier d'événements
Envisagez l'utilisation d'Apache Kafka qui peut stocker et distribuer des milliers d'événements par seconde et dispose de mécanismes de réplication et de tolérance aux pannes intégrés. Il a une mémoire persistante d'événements qui peuvent être stockés sur le disque indéfiniment et consommés à tout moment (mais non supprimés) du sujet (la file d'attente de fantaisie de Kafka) ont été livrés à.
Les événements sont ensuite affectés à des décalages qui les identifient de manière univoque dans le sujet - Kafka peut gérer les décalages lui-même, fournissant facilement une sémantique de livraison «au plus une fois» ou «au moins une fois», mais ils peuvent également être négociés lorsqu'un consommateur d'événements rejoint un sujet. , permettant aux microservices de commencer à consommer des événements à partir de n'importe quel endroit arbitraire dans le temps - généralement là où le consommateur s'est arrêté. Si le dernier décalage d'événement consommé persiste de manière transactionnelle dans le stockage local des services lorsque les cas d'utilisation se terminent avec succès, ce décalage peut facilement être utilisé pour obtenir une sémantique de livraison d'événement «une seule fois».
En fait, lorsque les consommateurs s'identifieront à Kafka, Kafka enregistrera quels messages ont été livrés à quel consommateur afin qu'il ne les réutilise plus.
Sagas
Pour les cas d'utilisation plus complexes où la communication entre différents services est en effet nécessaire, la responsabilité de terminer le cas d'utilisation doit être bien reconnue - le cas d'utilisation est décentralisé et ne se termine que lorsque tous les services impliqués reconnaissent que leur tâche a été menée à bien, sinon l'ensemble du cas d'utilisation doit échouer. et des mesures correctives doivent être déclenchées pour annuler tout état local non valide.
C'est alors que la saga entre en jeu. Une saga est une séquence de transactions locales. Chaque transaction locale met à jour la base de données et publie un message ou un événement pour déclencher la prochaine transaction locale dans la saga. Si une transaction locale échoue car elle enfreint une règle commerciale, la saga exécute une série de transactions compensatoires qui annulent les modifications apportées par les transactions locales précédentes. Lisez ceci pour plus d'informations.