Digital solutions
Design Patterns avec Laravel

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.