{"id":405,"date":"2025-03-22T12:39:01","date_gmt":"2025-03-22T11:39:01","guid":{"rendered":"https:\/\/wmg-studio.com\/?p=405"},"modified":"2025-03-22T12:39:52","modified_gmt":"2025-03-22T11:39:52","slug":"cqrs","status":"publish","type":"post","link":"https:\/\/wmg-studio.com\/index.php\/2025\/03\/22\/cqrs\/","title":{"rendered":"CQRS"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\/>\n  <title>CQRS &#8211; Introduction illustr\u00e9e<\/title>\n  <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;700&#038;display=swap\" rel=\"stylesheet\"\/>\n  <style>\n    body {\n      font-family: 'Inter', sans-serif;\n      margin: 0;\n      background-color: #f4f6f9;\n      color: #2c3e50;\n      line-height: 1.7;\n    }\n    header {\n      background: linear-gradient(to right, #3a7bd5, #00d2ff);\n      color: white;\n      padding: 3rem 1rem;\n      text-align: center;\n    }\n    header h1 {\n      font-size: 2.5rem;\n      margin: 0;\n    }\n    .container {\n      max-width: 960px;\n      margin: 2rem auto;\n      background: white;\n      padding: 2.5rem;\n      border-radius: 14px;\n      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.07);\n    }\n    h2, h3 {\n      color: #3a7bd5;\n      margin-top: 2rem;\n    }\n    h2 {\n      font-size: 1.8rem;\n      border-bottom: 2px solid #00d2ff;\n      padding-bottom: 0.3rem;\n    }\n    h3 {\n      font-size: 1.4rem;\n      margin-top: 1.5rem;\n    }\n    ul {\n      padding-left: 1.5rem;\n    }\n    li {\n      margin-bottom: 0.5rem;\n    }\n    pre {\n      background-color: #e1f5fe;\n      border-left: 5px solid #00d2ff;\n      padding: 1rem;\n      border-radius: 8px;\n      overflow-x: auto;\n      font-family: 'Courier New', monospace;\n      font-size: 0.95rem;\n      margin: 1.5rem 0;\n    }\n    img {\n      max-width: 100%;\n      border-radius: 10px;\n      box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1);\n      margin: 1rem 0;\n    }\n    .diagram {\n      background-color: #f0f8ff;\n      border: 1px solid #cce7ff;\n      border-radius: 8px;\n      padding: 1.5rem;\n      margin-top: 2rem;\n      font-size: 0.95rem;\n    }\n    footer {\n      text-align: center;\n      font-size: 0.9rem;\n      color: #888;\n      padding: 2rem 1rem;\n    }\n  <\/style>\n<\/head>\n<body>\n\n<header>\n  <h1>Introduction \u00e0 CQRS<\/h1>\n  <p>Comprendre le principe de Command Query Responsibility Segregation<\/p>\n<\/header>\n\n<div class=\"container\">\n  <h2>\ud83e\udde0 Qu\u2019est-ce que CQRS ?<\/h2>\n  <p>\n    CQRS signifie <strong>Command Query Responsibility Segregation<\/strong>, ou <em>S\u00e9paration des responsabilit\u00e9s Commande\/Requ\u00eate<\/em>.\n    C&rsquo;est un <strong>pattern d&rsquo;architecture logicielle<\/strong> qui consiste \u00e0 s\u00e9parer les op\u00e9rations de lecture (Query) de celles d\u2019\u00e9criture (Command) dans une application.\n  <\/p>\n\n  <h2>\ud83d\udd01 Pourquoi s\u00e9parer les lectures et les \u00e9critures ?<\/h2>\n  <ul>\n    <li>Les <strong>Commandes<\/strong> modifient l&rsquo;\u00e9tat du syst\u00e8me (\u00e9criture, mise \u00e0 jour, suppression)<\/li>\n    <li>Les <strong>Requ\u00eates<\/strong> r\u00e9cup\u00e8rent des donn\u00e9es sans modifier l\u2019\u00e9tat<\/li>\n    <li>En les s\u00e9parant, on peut <strong>optimiser<\/strong> chaque partie ind\u00e9pendamment (performance, s\u00e9curit\u00e9, scalabilit\u00e9)<\/li>\n  <\/ul>\n\n  <h2>\ud83d\udcca Illustration CQRS<\/h2>\n  <p>Voici une image du site Microsoft Learn repr\u00e9sentant CQRS :<\/p>\n  <img decoding=\"async\" src=\"https:\/\/learn.microsoft.com\/fr-fr\/dotnet\/architecture\/microservices\/microservice-ddd-cqrs-patterns\/media\/apply-simplified-microservice-cqrs-ddd-patterns\/simplified-cqrs-ddd-microservice.png\" \/>\n\n  <h2>\u2699\ufe0f Exemple de code en .NET (simplifi\u00e9)<\/h2>\n  <h3>Commande (Command)<\/h3>\n  <pre><code>public record CreateUserCommand(string Name);\n\npublic class CreateUserHandler\n{\n    public void Handle(CreateUserCommand command)\n    {\n        \/\/ Ajouter un utilisateur en base\n        Console.WriteLine($\"Nouvel utilisateur : {command.Name}\");\n    }\n}<\/code><\/pre>\n\n  <h3>Requ\u00eate (Query)<\/h3>\n  <pre><code>public class GetUserByIdQuery\n{\n    public int Id { get; set; }\n}\n\npublic class GetUserByIdHandler\n{\n    public string Handle(GetUserByIdQuery query)\n    {\n        \/\/ Rechercher l'utilisateur par ID\n        return $\"Utilisateur {query.Id}\";\n    }\n}<\/code><\/pre>\n\n  <h2>\ud83d\udcc8 Avantages de CQRS<\/h2>\n  <ul>\n    <li>S\u00e9paration claire des responsabilit\u00e9s<\/li>\n    <li>Possibilit\u00e9 de faire \u00e9voluer les mod\u00e8les de lecture\/\u00e9criture s\u00e9par\u00e9ment<\/li>\n    <li>Scalabilit\u00e9 am\u00e9lior\u00e9e : on peut scaler la lecture ind\u00e9pendamment de l\u2019\u00e9criture<\/li>\n    <li>Optimisation des performances de requ\u00eate<\/li>\n    <li>Facilite l&rsquo;int\u00e9gration de patterns comme Event Sourcing<\/li>\n  <\/ul>\n\n  <h2>\u26a0\ufe0f Inconv\u00e9nients de CQRS<\/h2>\n  <ul>\n    <li>Complexit\u00e9 architecturale plus importante<\/li>\n    <li>Pas n\u00e9cessaire pour des projets simples ou CRUD basiques<\/li>\n    <li>Risque de duplication de logique entre les mod\u00e8les<\/li>\n    <li>Demande rigueur dans la gestion des donn\u00e9es synchrones\/asynchrones<\/li>\n  <\/ul>\n\n  <h2>\ud83d\udcd8 Sch\u00e9ma interactif (\u00e9tapes simplifi\u00e9es)<\/h2>\n  <div class=\"diagram\">\n    <strong>\u00c9tapes d\u2019une commande (ex : cr\u00e9er un utilisateur)<\/strong> :<br><br>\n    1. L\u2019utilisateur soumet un formulaire \u2192 <em>Commande envoy\u00e9e<\/em><br>\n    2. La commande est re\u00e7ue par le <code>Handler<\/code><br>\n    3. Le handler modifie les donn\u00e9es dans la base<br>\n    4. Un \u00e9v\u00e9nement peut \u00eatre \u00e9mis (optionnel)<br><br>\n    <strong>\u00c9tapes d\u2019une requ\u00eate (ex : afficher un utilisateur)<\/strong> :<br><br>\n    1. Le client demande une donn\u00e9e \u2192 <em>Requ\u00eate envoy\u00e9e<\/em><br>\n    2. Le <code>QueryHandler<\/code> traite la requ\u00eate<br>\n    3. Une r\u00e9ponse optimis\u00e9e est renvoy\u00e9e (DTO, projections&#8230;)\n  <\/div>\n\n  <h2>\ud83d\udccc En r\u00e9sum\u00e9<\/h2>\n  <ul>\n    <li>CQRS s\u00e9pare la logique de lecture de celle d&rsquo;\u00e9criture<\/li>\n    <li>Apporte des b\u00e9n\u00e9fices en termes de scalabilit\u00e9 et d\u2019optimisation<\/li>\n    <li>N\u00e9cessite une complexit\u00e9 que tous les projets ne justifient pas<\/li>\n  <\/ul>\n<h2>\ud83d\udce6 Cas d\u2019usage concrets de CQRS<\/h2>\n  <h3>\ud83d\uded2 E-commerce<\/h3>\n  <p>\n    Dans les plateformes e-commerce, les lectures (affichage des produits, recherche, recommandations) sont tr\u00e8s fr\u00e9quentes,\n    tandis que les \u00e9critures (commandes, paiements) sont moins nombreuses mais critiques.\n    En s\u00e9parant les deux, on peut optimiser la base de donn\u00e9es de lecture pour la rapidit\u00e9 (ex : projection en cache) et garder la base d\u2019\u00e9criture s\u00e9curis\u00e9e et coh\u00e9rente.\n  <\/p>\n  \n  <h3>\ud83d\udcb3 Finance \/ Banque<\/h3>\n  <p>\n    Dans les syst\u00e8mes bancaires, chaque \u00e9criture (virement, retrait, paiement) doit \u00eatre fortement s\u00e9curis\u00e9e et audit\u00e9e.\n    En revanche, la lecture (solde du compte, historique) peut \u00eatre servie rapidement via des projections. CQRS permet ici de garantir la coh\u00e9rence tout en offrant performance aux utilisateurs.\n  <\/p>\n\n  <h3>\ud83d\ude9a Logistique \/ Supply Chain<\/h3>\n  <p>\n    Les syst\u00e8mes logistiques utilisent souvent CQRS pour g\u00e9rer les \u00e9tats des stocks (commandes modifiant les stocks, livraisons, etc.)\n    ind\u00e9pendamment des vues de consultation (\u00e9tats, pr\u00e9visions, reporting). Cela permet une grande flexibilit\u00e9 et des performances accrues.\n  <\/p>\n\n  <h3>\ud83e\uddfe Gestion documentaire \/ ERP<\/h3>\n  <p>\n    Les ERP ou GED (gestion \u00e9lectronique des documents) peuvent appliquer CQRS pour isoler les processus m\u00e9tiers lourds (validation, g\u00e9n\u00e9ration, modification)\n    des lectures simples ou archiv\u00e9es (affichage, export). Cela facilite aussi le versionnage et la tra\u00e7abilit\u00e9.\n  <\/p>\n<\/div>\n<\/div>\n\n<footer>\n  &copy; 2025 &#8211; Introduction CQRS par Farhat\n<\/footer>\n\n<\/body>\n<\/html>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>CQRS &#8211; Introduction illustr\u00e9e Introduction \u00e0 CQRS Comprendre le principe de Command Query Responsibility Segregation \ud83e\udde0 Qu\u2019est-ce que CQRS ? CQRS signifie Command Query Responsibility Segregation, ou S\u00e9paration des responsabilit\u00e9s Commande\/Requ\u00eate. C&rsquo;est un pattern d&rsquo;architecture logicielle qui consiste \u00e0 s\u00e9parer les op\u00e9rations de lecture (Query) de celles d\u2019\u00e9criture (Command) dans une application. \ud83d\udd01 Pourquoi s\u00e9parer les lectures et les \u00e9critures ? Les Commandes modifient l&rsquo;\u00e9tat du syst\u00e8me (\u00e9criture, mise \u00e0 jour, suppression) Les Requ\u00eates r\u00e9cup\u00e8rent des donn\u00e9es sans modifier l\u2019\u00e9tat En les s\u00e9parant, on peut optimiser chaque partie ind\u00e9pendamment (performance, s\u00e9curit\u00e9, scalabilit\u00e9) \ud83d\udcca Illustration CQRS Voici une image du site<\/p>\n","protected":false},"author":1,"featured_media":250,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[],"class_list":["post-405","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developpement-avance"],"_links":{"self":[{"href":"https:\/\/wmg-studio.com\/index.php\/wp-json\/wp\/v2\/posts\/405","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wmg-studio.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wmg-studio.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wmg-studio.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wmg-studio.com\/index.php\/wp-json\/wp\/v2\/comments?post=405"}],"version-history":[{"count":7,"href":"https:\/\/wmg-studio.com\/index.php\/wp-json\/wp\/v2\/posts\/405\/revisions"}],"predecessor-version":[{"id":412,"href":"https:\/\/wmg-studio.com\/index.php\/wp-json\/wp\/v2\/posts\/405\/revisions\/412"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wmg-studio.com\/index.php\/wp-json\/wp\/v2\/media\/250"}],"wp:attachment":[{"href":"https:\/\/wmg-studio.com\/index.php\/wp-json\/wp\/v2\/media?parent=405"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wmg-studio.com\/index.php\/wp-json\/wp\/v2\/categories?post=405"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wmg-studio.com\/index.php\/wp-json\/wp\/v2\/tags?post=405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}