Architecture systèmeArchitecte Backend

Décrivez le modèle "Bus d'événements" (Event Bus), où l'appliquer et quels pièges faut-il prendre en compte ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Le modèle "Bus d'événements" (Event Bus) est une approche architecturale permettant de réaliser la communication entre les composants d'un système par la publication et l'écoute d'événements. Les composants ne se connaissent pas directement, l'interaction se fait de manière faiblement couplée selon le principe "éditeur-abonné".

Utilisation : Ce modèle est utile là où il est nécessaire de garantir une interaction évolutive et extensible entre de nombreux modules - par exemple, dans des applications web complexes, des systèmes de bureau ou des plateformes de microservices.

Exemple de code en Python utilisant la bibliothèque pyee :

from pyee import EventEmitter bus = EventEmitter() def on_user_created(user): print(f"Utilisateur créé : {user}") bus.on('user_created', on_user_created) bus.emit('user_created', {"id": 1, "name": "Ivan"})

Caractéristiques principales :

  • Augmente la modularité, car les services communiquent via le bus, et non directement
  • Facilite l'ajout de nouveaux gestionnaires d'événements sans modifier le code existant
  • Peut conduire à des erreurs difficiles à détecter en raison de dépendances implicites et de la complexité du suivi des flux d'affaires

Questions piégées.

Tous les événements dans le Bus d'événements doivent-ils être persistants ?

Non, ce n'est pas nécessaire. Dans la plupart des cas, le Bus d'événements traite des événements éphémères qui ne sont pas sauvegardés. La persistance n'est nécessaire que si il est crucial de ne pas perdre des événements (par exemple, via Kafka).

Un événement sera-t-il perdu si aucun abonné n'est enregistré au moment de la publication ?

Oui, si le système ne conserve pas les événements (éphémères), l'événement sera perdu. Pour une livraison garantie, un Bus d'événements durable est nécessaire (par exemple, RabbitMQ avec des files d'attente persistantes).

Peut-on utiliser un seul Bus d'événements pour du code synchronisé et asynchrone sans restrictions ?

Non, un Bus d'événements synchrones peut bloquer le fil d'exécution jusqu'à la fin de tous les gestionnaires, ce qui est inacceptable pour une charge élevée. Pour des systèmes évolutifs, on utilise des Bus d'événements asynchrones ou on déplace le traitement des événements dans des processus/fils séparés (par exemple, via Celery).