Saga Pattern (Orchestration) vs Mediator Pattern
1. Saga Pattern (Orchestration)
- Gestion de processus distribués avec compensation : Le Saga Pattern avec Orchestration centralise la gestion de plusieurs étapes interdépendantes, notamment la gestion des messages dans un système de chat. Par exemple, si un message est supprimé mais que l'envoi de la notification d'alerte échoue, le message est restauré pour maintenir la cohérence du système.
- Compensation : Si une étape échoue (comme l'échec de l'envoi de la notification), une action de compensation est déclenchée pour restaurer l'état précédent, comme remettre le message supprimé.
- Exemple : Suppression d'un message dans un chat avec notification d'alerte. Si l'alerte ne parvient pas à être envoyée, le message supprimé est restauré.
2. Mediator Pattern
- Centralisation des communications : Le Mediator Pattern centralise l'envoi et la réception des messages entre les utilisateurs. Le médiateur gère la distribution des messages et, en parallèle, peut déclencher des actions telles que l'envoi de notifications administratives.
- Réduction du couplage : Ce pattern réduit les interactions directes entre les utilisateurs (ou objets) du système de chat. Le médiateur agit comme un relais entre les utilisateurs pour transmettre les messages et gérer des actions annexes comme l'envoi de notifications.
- Exemple : Un système de chat où les utilisateurs communiquent via le médiateur. Si un administrateur envoie un message, le médiateur envoie automatiquement une notification sans que les autres utilisateurs ne soient affectés.
Comparaison directe :
| Caractéristique | Saga Pattern (Orchestration) | Mediator Pattern |
|---|---|---|
| Objectif principal | Gérer des processus distribués avec compensation | Centraliser les communications entre objets |
| Compensation en cas d'échec | Oui, via des actions compensatoires | Non, pas de gestion d'échecs |
| Contrôle des interactions | Centralisé via un orchestrateur | Centralisé via un médiateur |
| Scénario typique | Transactions complexes avec plusieurs étapes | Gestion d'interactions ou d'événements simples entre objets |
| Réduction du couplage | Oui, réduit les dépendances entre services | Oui, réduit les dépendances entre objets |
| Flexibilité pour ajouter des étapes | Moyen, modification de l'orchestrateur nécessaire | Élevée, ajout d'objets et d'interactions simplifiés |
Exemples
1. Saga Pattern (Orchestration)
Dans un système de chat, imaginons que lorsqu'un utilisateur supprime un message, une notification soit envoyée pour alerter les autres utilisateurs. Si l'envoi de la notification échoue, le message supprimé est restauré pour garantir la cohérence du système.
$saga = new SagaOrchestrator();
$saga->addStep(new DeleteMessageStep()); // Suppression du message
$saga->addStep(new SendNotificationStep()); // Envoi de la notification
$saga->execute(); // Exécute la saga, et restaure le message si la notification échoue
Dans cet exemple, le Saga Pattern permet de s'assurer que si la notification n'est pas envoyée correctement, le message supprimé est restauré grâce à l'action de compensation.
2. Mediator Pattern
Dans un système de chat, le médiateur gère l'envoi des messages et des notifications sans compensation en cas d'échec. Si un administrateur envoie un message, le médiateur gère l'envoi du message aux autres utilisateurs ainsi que la notification d'administration.
$mediator = new ConcreteChatMediator();
$user1 = new ChatUser('Alice', $mediator);
$user2 = new ChatUser('Bob', $mediator, true); // Bob est administrateur
$mediator->addUser($user1);
$mediator->addUser($user2);
$user1->sendMessage("Hello!"); // Le médiateur distribue le message
$user2->sendMessage("Admin message"); // Le médiateur envoie aussi une notification pour l'administrateur
Dans cet exemple, le Mediator Pattern permet de centraliser les communications, mais il ne gère pas d'échec ni de compensation.
Explications
Avec le Saga Pattern (Orchestration), chaque étape du processus est contrôlée par un orchestrateur, et en cas d'échec (comme l'envoi d'une notification dans notre exemple), une action compensatoire est déclenchée (restauration du message). Cela le rend idéal pour les transactions complexes et distribuées, où il faut garantir la cohérence des actions.
Le Mediator Pattern, quant à lui, centralise simplement la gestion des interactions sans gérer d'actions compensatoires en cas d'échec. Il est parfait pour des systèmes plus simples où les objets doivent interagir de manière organisée, mais où la gestion d'échecs complexes n'est pas nécessaire.
Cas d'utilisation des patterns
Le Saga Pattern (Orchestration) est utile pour gérer des processus où chaque étape est critique, comme la gestion de transactions distribuées dans un système de chat qui doit compenser une action si une autre échoue, garantissant ainsi que l'intégrité du système est préservée.
Le Mediator Pattern est mieux adapté à des situations où de multiples objets communiquent entre eux de manière directe, mais où une gestion d'échec n'est pas nécessaire. Il convient aux systèmes de chat où le médiateur gère simplement l'envoi de messages et les notifications sans actions compensatoires.
Conclusion
Bien que le Saga Pattern (Orchestration) et le Mediator Pattern partagent une logique de centralisation, ils s'appliquent dans des contextes différents :
Le Saga Pattern (Orchestration) est plus approprié lorsque les transactions complexes nécessitent des compensations en cas d'échec, comme dans notre exemple de suppression de message avec restauration si l'envoi de notification échoue.
Le Mediator Pattern se concentre sur la centralisation des communications et convient à des systèmes plus simples, sans la nécessité de gérer des échecs complexes. Il est idéal pour des systèmes comme un chat où les interactions entre utilisateurs sont gérées de manière organisée, sans gestion d'erreurs critiques.