Introduction à CQRS
Comprendre le principe de Command Query Responsibility Segregation
🧠 Qu’est-ce que CQRS ?
CQRS signifie Command Query Responsibility Segregation, ou Séparation des responsabilités Commande/Requête. C’est un pattern d’architecture logicielle qui consiste à séparer les opérations de lecture (Query) de celles d’écriture (Command) dans une application.
🔁 Pourquoi séparer les lectures et les écritures ?
- Les Commandes modifient l’état du système (écriture, mise à jour, suppression)
- Les Requêtes récupèrent des données sans modifier l’état
- En les séparant, on peut optimiser chaque partie indépendamment (performance, sécurité, scalabilité)
📊 Illustration CQRS
Voici une image du site Microsoft Learn représentant CQRS :
⚙️ Exemple de code en .NET (simplifié)
Commande (Command)
public record CreateUserCommand(string Name);
public class CreateUserHandler
{
public void Handle(CreateUserCommand command)
{
// Ajouter un utilisateur en base
Console.WriteLine($"Nouvel utilisateur : {command.Name}");
}
}
Requête (Query)
public class GetUserByIdQuery
{
public int Id { get; set; }
}
public class GetUserByIdHandler
{
public string Handle(GetUserByIdQuery query)
{
// Rechercher l'utilisateur par ID
return $"Utilisateur {query.Id}";
}
}
📈 Avantages de CQRS
- Séparation claire des responsabilités
- Possibilité de faire évoluer les modèles de lecture/écriture séparément
- Scalabilité améliorée : on peut scaler la lecture indépendamment de l’écriture
- Optimisation des performances de requête
- Facilite l’intégration de patterns comme Event Sourcing
⚠️ Inconvénients de CQRS
- Complexité architecturale plus importante
- Pas nécessaire pour des projets simples ou CRUD basiques
- Risque de duplication de logique entre les modèles
- Demande rigueur dans la gestion des données synchrones/asynchrones
📘 Schéma interactif (étapes simplifiées)
1. L’utilisateur soumet un formulaire → Commande envoyée
2. La commande est reçue par le
Handler3. Le handler modifie les données dans la base
4. Un événement peut être émis (optionnel)
Étapes d’une requête (ex : afficher un utilisateur) :
1. Le client demande une donnée → Requête envoyée
2. Le
QueryHandler traite la requête3. Une réponse optimisée est renvoyée (DTO, projections…)
📌 En résumé
- CQRS sépare la logique de lecture de celle d’écriture
- Apporte des bénéfices en termes de scalabilité et d’optimisation
- Nécessite une complexité que tous les projets ne justifient pas
📦 Cas d’usage concrets de CQRS
🛒 E-commerce
Dans les plateformes e-commerce, les lectures (affichage des produits, recherche, recommandations) sont très fréquentes, tandis que les écritures (commandes, paiements) sont moins nombreuses mais critiques. En séparant les deux, on peut optimiser la base de données de lecture pour la rapidité (ex : projection en cache) et garder la base d’écriture sécurisée et cohérente.
💳 Finance / Banque
Dans les systèmes bancaires, chaque écriture (virement, retrait, paiement) doit être fortement sécurisée et auditée. En revanche, la lecture (solde du compte, historique) peut être servie rapidement via des projections. CQRS permet ici de garantir la cohérence tout en offrant performance aux utilisateurs.
🚚 Logistique / Supply Chain
Les systèmes logistiques utilisent souvent CQRS pour gérer les états des stocks (commandes modifiant les stocks, livraisons, etc.) indépendamment des vues de consultation (états, prévisions, reporting). Cela permet une grande flexibilité et des performances accrues.
🧾 Gestion documentaire / ERP
Les ERP ou GED (gestion électronique des documents) peuvent appliquer CQRS pour isoler les processus métiers lourds (validation, génération, modification) des lectures simples ou archivées (affichage, export). Cela facilite aussi le versionnage et la traçabilité.

