Nouveau : Datasets open source gratuits disponibles !Decouvrir →
📨
Architecture 20 min avance

Event-Driven Architecture

Sommaire

Contexte et enjeux

L'événementiel architecture (Event-Driven Architecture) est devenu une approche préférée pour les systèmes modernes et évolutifs. Elle permet d'implémenter des architectures plus flexibles, scalables et réactives grâce à l'utilisation de messages comme vecteur de communication entre différentes composantes du système. Cette architecture est particulièrement utile dans le contexte des entreprises qui souhaitent gérer une croissance exponentielle et des volumes de données importants.

Les enjeux majeurs liés à l'adoption d'une architecture événementielle incluent :

  • Scalabilité : Permet une augmentation du nombre de services sans perte de performance.
  • Réactivité : Les systèmes peuvent réagir rapidement aux changements et aux nouvelles entrées.
  • Fiabilité : La déconnexion ou le dysfonctionnement d'un composant ne doit pas affecter les autres.
  • Flexibilité : L'ajout ou la modification de composants sans impact majeur sur l'ensemble du système.
  • Séparation des préoccupations : Les responsabilités sont clairement définies entre les différents services.

Concepts clés (avec schémas ou exemples)

1. Evénements

Les événements sont des objets contenant des données qui décrivent quelque chose de s'est passé dans le système. Ils peuvent être créés par n'importe quel service et distribués à d'autres services via une plateforme d'échange d'événements.

Exemple :

{
  "event_type": "user_registered",
  "timestamp": "2023-04-15T10:00:00Z",
  "data": {
    "user_id": "12345",
    "username": "john_doe"
  }
}

2. Abonnés

Les abonnés sont des services qui s'inscrivent pour recevoir les événements de certaines types. Ils traitent ensuite ces événements en conséquence.

Schéma :

+-----------+
| Event     |
| Producer  |
+----+------+
     |
     v
+----v------+
| Event     |
| Bus       |
+----+------+
     |
     v
+----v------+    +----v------+
| Service A |    | Service B |
+-----------+    +-----------+

3. Plateforme d'échange d'événements (Event Bus)

La plateforme d'échange d'événements est le composant central qui distribue les événements aux abonnés appropriés. Elle garantit la fiabilité et l'ordre des événements.

Exemples de plateformes d'échange d'événements :

  • Apache Kafka
  • RabbitMQ
  • AWS EventBridge

4. Corrélation et idempotence

La corrélation permet de suivre les états des opérations pour éviter les doubles traitements. L'idempotence garantit que l'application d'un même événement multiple fois a le même effet.

Exemple de code pour la gestion de l'idempotence :

@Service
public class EventProcessor {
    @Autowired
    private EventRepository eventRepository;

    public void processEvent(Event event) {
        if (isProcessed(event.getId())) {
            return;
        }
        // Traitement de l'événement
        saveAsProcessed(event);
    }

    private boolean isProcessed(String eventId) {
        return eventRepository.existsById(eventId);
    }

    private void saveAsProcessed(Event event) {
        eventRepository.save(event);
    }
}

5. Pattern d'architecture événementielle

a. Publish-Subscribe

Les services publient des événements et s'inscrivent pour les recevoir.

Schéma :

+-----------+
| Event     |
| Producer  |
+----+------+
     |
     v
+----v------+
| Event     |
| Bus       |
+----+------+
     |
     v
+----v------+    +----v------+
| Service A |    | Service B |
+-----------+    +-----------+

b. Command Query Responsibility Segregation (CQRS)

L'architecture CQRS permet de séparer les commandes (mutations des données) et les requêtes (lecture des données).

Schéma :

+-------------+
| Command Bus   |
+----+--------+
     |
     v
+----v------+
| Service A |    +----v------+
+-----------+    | Service B |
                 +-----------+

c. Saga Pattern

La saga pattern est utilisée pour coordonner plusieurs services impliqués dans une transaction complexe.

Schéma :

+-------------+
| Command Bus   |
+----+--------+
     |
     v
+----v------+
| Service A |    +----v------+    +----v------+
+-----------+    | Service B |    | Service C |
                 +-----------+    +-----------+

Guide pratique pas-a-pas

1. Identifier les événements clés

Commencez par identifier les actions majeures dans votre système et déterminez quelles informations doivent être transmises en tant qu'événement.

Exemple :

  • Utilisateur s'inscrit (user_registered)
  • Commande passée (order_placed)
  • Paiment effectué (payment_processed)

2. Sélectionner une plateforme d'échange d'événements

Choisissez une plateforme d'échange d'événements qui correspond à votre infrastructure et à vos besoins en termes de fiabilité et de performance.

Exemple :

  • Apache Kafka pour des volumes importants et haute disponibilité
  • AWS EventBridge pour un déploiement rapide et intégration facile

3. Créer les abonnés

Développez chaque service qui doit traiter les événements en conséquence.

Exemple de code pour un service d'abonnement :

@Service
public class UserRegistrationService {
    @Autowired
    private UserRepository userRepository;

    @EventListener
    public void handleUserRegisteredEvent(UserRegisteredEvent event) {
        User user = new User(event.getData().getUserId(), event.getData().getUsername());
        userRepository.save(user);
    }
}

4. Assurer la fiabilité et l'idempotence

Mise en place des mécanismes de corrélation et d'idempotence pour éviter les doubles traitements.

Exemple de code pour une classe d'assurance :

@Component
public class EventAssurance {
    @Autowired
    private EventRepository eventRepository;

    public boolean isProcessed(String eventId) {
        return eventRepository.existsById(eventId);
    }

    public void markAsProcessed(String eventId) {
        eventRepository.save(new Event(eventId));
    }
}

5. Déployer et tester l'architecture

Déployez les services et vérifiez la fiabilité de l'architecture en simulant des événements et en observant le comportement des abonnés.

Exemple de code pour un test unitaire :

@SpringBootTest
public class EventProcessorTest {
    @Autowired
    private UserRegistrationService userRegistrationService;

    @MockBean
    private UserRepository userRepository;

    @Test
    public void shouldProcessUserRegisteredEvent() {
        UserRegisteredEvent event = new UserRegisteredEvent(
            "user_registered",
            LocalDateTime.now(),
            Map.of("userId", "12345", "username", "john_doe")
        );

        userRegistrationService.handleUserRegisteredEvent(event);

        verify(userRepository, times(1)).save(any(User.class));
    }
}

Comparatif ou tableau recapitulatif

Concept Description
Evénements Objet contenant des données décrivant un événement spécifique.
Abonnés Services qui s'inscrivent pour recevoir et traiter les événements.
Event Bus Plateforme centralisée distribuant les événements aux abonnés.
Corrélation Suivi des états des opérations pour éviter les doubles traitements.
Idempotence Assure que le traitement d'un même événement multiple fois a le même effet.

Retour d'expérience concret

En tant qu'architecte senior, j'ai eu l'occasion de travailler sur plusieurs projets utilisant une architecture événementielle. L'une des premières difficultés était la mise en place du système de détection des doubles traitements. J'ai utilisé un mécanisme basé sur une base de données pour corriger cela, mais il y a des solutions plus sophistiquées comme les UUID globaux.

Une autre leçon importante est l'importance d'un bon Event Bus. Un Event Bus centralisé peut aider à organiser et à gérer l'événementiel dans un système complexe. Je recommanderais fortement la mise en place de mécanismes de surveillance et de logging pour les événements afin de faciliter le débogage et la maintenance.

Checklist ou plan d'action

Pour mettre en œuvre une architecture événementielle, voici une liste de tâches à accomplir :

  1. Identifier les événements clés : Analysez votre système et définissez les actions majeures qui devraient générer des événements.
  2. Sélectionner une plateforme d'échange d'événements : Choisissez une solution adaptée à vos besoins en termes de performance et de fiabilité.
  3. Créer les abonnés : Développez chaque service qui doit traiter les événements en conséquence.
  4. Assurer la fiabilité et l'idempotence : Mettez en place des mécanismes pour éviter les doubles traitements et assurer l'idempotence.
  5. Déployer et tester l'architecture : Déployez les services et vérifiez leur comportement en simulant des événements.

En suivant ces étapes, vous serez bien sur la voie pour mettre en œuvre une architecture événementielle robuste et performante dans votre système.

Un projet tech a lancer ?

Besoin d'un accompagnement ? Decrivez votre projet pour des recommandations.

Recevoir des conseils

Questions frequentes

Qu'est-ce que l'architecture orientée événements?
L'architecture orientée événements est un modèle de conception qui s'appuie sur des événements pour coordonner les différentes parties d'une application. Les composants de l'application émettent et réceptent des événements pour communiquer entre eux.
Quels sont les avantages de l'utilisation de l'architecture orientée événements?
L'architecture orientée événements offre plusieurs avantages, notamment une séparation claire des responsabilités, la facilité d'évolutivité et la possibilité de gérer des événements asynchrones.
Comment fonctionne un système basé sur l'architecture orientée événements?
Un système basé sur l'architecture orientée événements comprend généralement des émetteurs d'événements, qui génèrent et publient des événements, et des consommateurs d'événements, qui les reçoivent et traitent. Les événements sont souvent stockés dans une file d'attente pour être traités à un moment donné.

Pages liees

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.