Skip to content
Learni
View all tutorials
Architecture Logicielle

Comment implémenter une architecture event-driven en 2026

Introduction

L'architecture event-driven permet aux composants d'une application de communiquer via des événements plutôt que des appels directs. Cela rend le système plus flexible, scalable et facile à maintenir. Dans ce tutoriel, vous allez construire un système simple de traitement de commandes où chaque étape (création, paiement, expédition) réagit à des événements. Cette approche évite le couplage fort entre modules et facilite l'ajout de nouvelles fonctionnalités.

Prérequis

  • Node.js 20 ou supérieur
  • Connaissances basiques de JavaScript
  • Un éditeur de code (VS Code recommandé)

Initialisation du projet

terminal
mkdir event-driven-demo
cd event-driven-demo
npm init -y
npm install events

Cette commande crée le dossier du projet et initialise un projet Node.js. Le module events est natif mais nous l'importons explicitement pour la clarté.

Création du bus d'événements

eventBus.js
const EventEmitter = require('events');

class EventBus extends EventEmitter {
  emitEvent(eventName, payload) {
    console.log(`[EventBus] Événement émis: ${eventName}`);
    this.emit(eventName, payload);
  }
}

const eventBus = new EventBus();
module.exports = eventBus;

Nous créons une classe EventBus qui étend EventEmitter. La méthode emitEvent centralise les logs et l'émission des événements pour simplifier le débogage.

Service de commandes

orderService.js
const eventBus = require('./eventBus');

function createOrder(orderData) {
  console.log('Commande créée:', orderData.id);
  eventBus.emitEvent('order.created', orderData);
}

module.exports = { createOrder };

Le service de commandes émet simplement un événement 'order.created' après avoir créé une commande. Il ne connaît ni le paiement ni l'expédition.

Gestionnaire de paiement

paymentHandler.js
const eventBus = require('./eventBus');

eventBus.on('order.created', (order) => {
  console.log(`Paiement traité pour la commande ${order.id}`);
  eventBus.emitEvent('payment.completed', { orderId: order.id, status: 'paid' });
});

Ce handler s'abonne à 'order.created' et émet un nouvel événement 'payment.completed'. Il illustre le chaînage d'événements sans couplage direct.

Gestionnaire d'expédition

shippingHandler.js
const eventBus = require('./eventBus');

eventBus.on('payment.completed', (payment) => {
  console.log(`Expédition lancée pour la commande ${payment.orderId}`);
});

Le dernier handler réagit uniquement à l'événement de paiement. Ajouter de nouveaux handlers ne nécessite aucune modification des services existants.

Application principale

index.js
const { createOrder } = require('./orderService');
require('./paymentHandler');
require('./shippingHandler');

const newOrder = { id: 'ORD-123', amount: 49.99 };
createOrder(newOrder);

Le fichier principal importe les handlers (pour les enregistrer) puis déclenche le flux. Exécutez avec node index.js pour voir le flux complet d'événements.

Bonnes pratiques

  • Nommez les événements de façon descriptive (order.created, payment.completed)
  • Centralisez le bus d'événements dans un module unique
  • Évitez les effets de bord dans les handlers
  • Ajoutez des logs clairs sur chaque émission d'événement
  • Testez chaque handler de manière isolée

Erreurs courantes à éviter

  • Oublier d'importer les handlers avant d'émettre des événements
  • Utiliser des noms d'événements trop génériques
  • Ne pas gérer les erreurs dans les listeners
  • Créer des dépendances cycliques entre handlers

Pour aller plus loin

Pour approfondir les architectures event-driven et les patterns avancés, découvrez nos formations Learni.