Table of Contents
L'architecture d'événements (EDA) est devenue un paradigme fondamental de conception pour construire des systèmes distribués, évolutifs et réactifs. Plutôt que de compter sur un couplage serré entre les composants par des appels de méthodes directes ou des invocations de procédures à distance, l'EDA déplace la communication vers la production, la détection et la consommation d'événements. Un événement est un changement significatif de l'état — ce qui peut être fait par d'autres parties du système. Ce découplage permet à chaque service d'évoluer de façon autonome, d'évoluer et de réagir aux changements qui se produisent.
Qu'est-ce que l'architecture d'événements ?
Un événement est un enregistrement immuable de quelque chose qui s'est passé dans le passé — par exemple, OrderPlaced[, [UserInscribed[, ou PaiementÉchec[.Les composants connus comme les producteurs d'événements génèrent ces événements sans savoir quels composants les consommeront.Les consommateurs d'événements s'abonnent à des types spécifiques d'événements et réagissent en conséquence.Un courtier d'événements, comme Apache Kafka, RabbitMQ ou AWS EventBridge, se trouve entre les producteurs et les consommateurs, assurant une livraison fiable, la persistance et la commande de sémantiques au besoin.
Cette architecture contraste avec les modèles traditionnels de request-response synchrones, où un service appelle directement un autre service et attend une réponse. La communication synchrone crée un couplage serré : si le service en aval est lent ou indisponible, l'appelant est bloqué. Avec EDA, les producteurs font feu et poursuivent immédiatement leur travail. Les consommateurs traitent les événements asynchronement, souvent avec leurs propres politiques de mise à l'échelle.
L'EDA est particulièrement puissant dans les écosystèmes de microservices, les environnements polyglottes et tout domaine qui nécessite un débit élevé, une faible latence ou des flux de travail liés à des événements tels que le traitement des commandes, l'ingestion de données IoT et la détection de fraudes.
Les modèles de base dans l'architecture animée par des événements
Publier/s'abonner (Pub/Sub)
Le modèle Publish/Subscribe (Pub/Sub) est le modèle EDA le plus simple et le plus largement adopté. Dans ce modèle, les éditeurs émettent des événements sur un sujet ou une chaîne. Les abonnés s'inscrivent dans ces sujets et reçoivent tous les événements qui leur sont publiés. Le courtier gère les fan-out, les garanties de livraison et le filtrage.
Par exemple, considérez une plateforme de commerce électronique. Lorsqu'un client passe une commande, le service de commande publie un OrderPlaced événement sur un thème «commandes». Plusieurs abonnés prennent cet événement:
- Le service d'inventaire déduit les stocks.
- Le service de facturation facture le client.
- Le service de notification envoie une confirmation par courriel.
- Le service d'analyse enregistre l'événement pour rapporter.
Chaque abonné traite l'événement de façon indépendante et à son propre rythme. Si le service de notification est lent, il n'affecte pas le service de commande ou de stockage. Ce modèle supporte naturellement l'échelle; vous pouvez ajouter plus d'instances du service de l'inventaire pour gérer la charge accrue sans toucher d'autres composants.
Les outils les plus populaires pour mettre en œuvre Pub/Sub comprennent Apache Kafka[, qui fournit des flux d'événements à haut débit, persistants et rejouables; RabbitMQ[ avec son routage et ses échanges de sujets; et des services cloud-native comme AWS EventBridge, qui offre un registre schéma et un filtrage.
Ségrégation des responsabilités en matière de requêtes de commandement (CQRS)
La séparation des requêtes de commande (CQRS) est un modèle qui sépare les opérations d'écriture (commandes) des opérations de lecture (demandes) en différents modèles. Dans les systèmes CRUD traditionnels, le même modèle de données est utilisé pour les mises à jour et les lectures, ce qui peut conduire à des problèmes de performance lorsque la charge de travail est déséquilibrée — par exemple, un chemin d'écriture complexe qui doit également servir les requêtes de lecture optimisées pour un schéma différent.
Dans un système basé sur CQRS, une commande comme PlaceOrder déclenche un modèle d'écriture qui valide les règles d'affaires et produit un événement (par exemple, OrderCreated[). Cet événement met à jour la base de données côté écriture. Entre-temps, un modèle de lecture séparé — souvent dénormalisé, optimisé par requête — écoute le même événement et met à jour ses propres tables.
Les avantages du SQQC sont les suivants :
- Performance : Les charges de travail lourdes en lecture peuvent être servies par des magasins spécialisés sans contestation de la part des écrits.
- Sécurité:[ Vous pouvez exposer des commandes et des requêtes à différents publics; par exemple, une commande peut nécessiter une authentification, alors qu'une requête publique est en lecture seule.
- Scalabilité:[ Les côtés lus et écrits peuvent s'écheller indépendamment sur différents matériels ou clusters.
- Flexibilité: Vous pouvez évoluer le schéma de lecture sans affecter la logique côté commande.
Cependant, CQRS ajoute de la complexité parce qu'il introduit éventuellement la cohérence et nécessite souvent une synchronisation par événement entre les deux côtés. Il s'associe naturellement à Event Sourcing, où le côté écriture stocke une séquence d'événements plutôt qu'un instantané d'état courant. L'article de Martin Fowler sur CQRS est une excellente ressource pour comprendre les compromis du modèle.
Sourcing événement
L'approvisionnement en événements est un modèle où les changements d'état sont stockés comme une séquence chronologique d'événements, non comme un instantané de l'état courant. Plutôt que d'écraser un enregistrement dans une base de données, chaque mutation génère un nouvel événement annexé à un journal d'événements. L'état courant peut être dérivé en rejouant tous les événements depuis le début — ou en utilisant des instantanés à intervalles pour accélérer la récupération.
Event Sourcing offre plusieurs avantages puissants:
- Filt de vérification complet: Chaque changement est enregistré, vous permettant de voir l'historique complet d'une entité.
- Débogage et débogage: Vous pouvez rejouer des événements dans un environnement de développement pour reproduire des bugs ou tester une nouvelle logique d'affaires.
- Requêtes temporelles: Vous pouvez demander quel était l'état à tout moment.
- Facile d'adopter CQRS:[ Le magasin d'événements sert de modèle d'écriture, et les modèles de lecture peuvent s'abonner aux événements pour des mises à jour en temps réel.
Le principal compromis est le stockage et la complexité accrues. Interroger directement le magasin d'événements est souvent inefficace, donc vous construisez généralement des modèles de lecture (Projections) qui matérialisent les vues. L'approvisionnement en événements est commun dans des domaines comme la comptabilité financière, les banques et l'édition collaborative de documents où chaque changement doit être enregistré.
Diffusion d'événements
Le streaming d'événements traite les événements comme un flux de données continu et non consolidé. Ce modèle est utilisé pour l'analyse en temps réel, la surveillance et l'intégration des données à l'échelle. En cas de streaming, les événements sont ingérés par plusieurs producteurs et traités en temps quasi réel par des processeurs de flux qui filtrent, agrégent et transforment les données.
Apache Kafka est le standard de facto pour le streaming d'événements. Il stocke les événements dans des journaux immuables sur les partitions pour la tolérance aux défauts et l'évolutivité horizontale. Les cadres de traitement de flux comme Kafka Streams, Apache Flink et Spark Streaming permettent le traitement d'événements complexes avec exactement une seule sémantique. Par exemple, une compagnie de covoiturage peut diffuser des emplacements GPS pour calculer le prix des surtensions, détecter la disponibilité des pilotes et mettre à jour les ETA des pilotes — le tout en temps réel.
Le streaming d'événements est également fondamental pour les microservices de maillage de données et les microservices axés sur des événements où vous voulez découpler les producteurs de données des consommateurs au niveau de l'infrastructure de données.
Autres motifs importants en combinaison
Modèle de Saga
Dans les transactions distribuées, en particulier au sein des microservices, le modèle Saga gère des workflows en plusieurs étapes. Chaque étape d'une saga publie un événement ou effectue une action. Si une étape échoue, la saga effectue des opérations de compensation pour faire reculer les étapes précédentes. Sagas peut être orchestrée (un coordonnateur central dit à chaque service ce qu'il faut faire) ou chorégraphiée (chaque service écoute les événements et décide de lui-même). EDA permet le chorégraphie des sagas : un service émet un événement, le service suivant fait sa part, et s'il échoue, il émet un événement de défaillance qui déclenche des retournements. Ce modèle est essentiel pour maintenir la cohérence des données sans verrouillage distribué.
Programmation réactive
Bien que pas strictement un modèle architectural, la programmation réactive est un modèle de programmation qui s'harmonise bien avec EDA. Des cadres comme RxJS, Reactor et Akka Streams permettent aux développeurs de composer une logique asynchrone et basée sur des événements en utilisant des séquences observables. Ceci est particulièrement utile pour les clients (p. ex., des mises à jour d'interface utilisateur en temps réel) et dans les flux côté serveur où vous devez traiter des volumes élevés d'événements avec contrepression.
Collaboration événementielle
La collaboration événementielle est un modèle où les services partagent un modèle d'événement commun et communiquent uniquement par des événements. Chaque service maintient sa propre logique de domaine et projette les événements dans ses propres magasins de données. Il n'y a pas d'appels d'API directs de service à service. Ce modèle maximise l'autonomie et est souvent utilisé dans la conception axée sur le domaine avec des contextes délimités. Le principal défi est la mise en forme : lorsque le schéma d'événement change, tous les consommateurs doivent être mis à jour ou tolérer l'évolution du schéma (par exemple, en utilisant Avro ou Protobuf avec des registres de schéma).
Choisir le bon modèle
La sélection d'un modèle d'EDA dépend de vos exigences spécifiques.
- Couplage et indépendance:[ Si vous avez besoin d'un découplage élevé et de nombreux consommateurs, Pub/Sub est simple. Si vous avez besoin de modèles séparés de lecture et d'écriture, combinez CQRS avec Event Sourcing.
- Besoins de cohérence :[ Pour une bonne cohérence, évitez l'ADE; utilisez des transactions distribuées ou une base de données avec un ACID strict. Pour une éventuelle cohérence, le CQRS et l'Approvisionnement en événements fonctionnent bien.
- Typologie et latence:[ Event streaming (Kafka) donne le meilleur débit, tandis que Pub/Sub avec un courtier comme RabbitMQ offre latence inférieure pour les messages plus petits.
- Auditabilité:[ L'approvisionnement en événements est idéal pour les industries exigeantes en conformité.
- Maturité de l'équipe: CQRS et Event Sourcing augmentent la complexité. Assurez-vous que votre équipe comprend la cohérence éventuelle, l'évolution du schéma et l'idempotency.
Avantages de l'architecture animée par des événements
Au-delà des avantages immédiats du découplage et de l'évolutivité, EDA offre plusieurs avantages opérationnels et commerciaux :
- Scalabilité:[ Chaque composant s'équilibre indépendamment selon sa propre charge. Lors d'une vente flash, vous pouvez faire une échelle du service de commande et de ses abonnés sans toucher aux services de facturation ou d'expédition.
- Flexibilité: L'ajout d'un nouveau consommateur (p. ex., un nouveau pipeline d'analyse) n'exige aucun changement pour les producteurs, ce qui facilite l'évolution du système au fil du temps.
- Réaction en temps réel: EDA prend naturellement en charge les expériences des utilisateurs en temps réel, comme les tableaux de bord en direct, les notifications et les mises à jour instantanées.
- Résilience: Si un consommateur échoue, les événements persistent chez le courtier et peuvent être rejoués. Les producteurs continuent de travailler. Cet isolement empêche les échecs en cascade.
- Observabilité: Les journaux d'événements fournissent une riche source de données pour la surveillance, l'alerte et le débogage des traces distribuées.
- Intégration des données: Les événements peuvent être transmis aux lacs de données, aux entrepôts ou aux pipelines d'apprentissage automatique pour l'analyse, faisant du système une source de vérité pour l'ensemble de l'organisation.
Défis et meilleures pratiques
L'AED est puissante, mais pas sans pièges.
- Consistance des événements:[ Les consommateurs peuvent voir des données inexistantes. Vous devez concevoir des processus commerciaux qui tolèrent les retards et mettent en œuvre des gestionnaires idéoptents.
- Complexité:[ La gestion des schémas d'événements, des versions et des flux d'événements multiples peut être redoutable.
- Débogage et surveillance:[ Les flux d'événements distribués sont plus difficiles à tracer.Investir dans des outils d'observation comme le traçage distribué (Jaeger, OpenTelemetry) et l'agrégation de log.
- Doublon de données: Les événements peuvent être dupliqués; rendre vos consommateurs idémpotent de sorte que le traitement d'un événement deux fois a le même effet que le traitement une fois.
- Ordre : Tous les flux d'événements n'ont pas besoin d'un ordre strict, mais lorsqu'ils le font (p. ex., transitions d'état d'une seule entité), partition par clé (p. ex., ID de l'entité) et s'assurer que le courtier conserve l'ordre dans une partition.
Les meilleures pratiques sont les suivantes : commencer simplement — utiliser Pub/Sub en premier et ajouter CQRS ou Event Sourcing seulement lorsque cela est justifié; investir dans un bon registre de schéma; faire appliquer les files d'attente pour les événements échoués; et simuler les échecs régulièrement pour assurer le fonctionnement de votre logique de compensation de saga.
Conclusion
Les modèles d'architecture pilotés par l'événement, depuis le Pub/Sub fondamental jusqu'au CQRS plus spécialisé, l'Approvisionnement par l'événement et la diffusion en continu des événements, offrent une trousse robuste pour les systèmes de construction évolutives, résilients et réceptifs. En découplant les producteurs et les consommateurs, EDA permet aux équipes d' itérer de façon indépendante, de gérer avec grâce des charges imprévisibles et de débloquer des capacités en temps réel.