Command and Query Responsibility Segregation – CQRS

29 aprile 2025

Command and Query Responsibility Segregation (CQRS)

a cura di Giorgio Zucchini

Giorgio è un backend developer. Il suo stack di riferimento è .NET 8, MS SQL Server, PostgreSQL/ MongoDB. Quando non sviluppa, Giorgio si occupa dei suoi amici pelosi (per ora ha cinque gatti, ma in futuro si potrebbe allargare la cerchia), ama i giochi di ruolo ed esplorare nuovi posti nel week-end insieme alla sua famiglia.

Che cos'è CQRS?

Giorgio: “Quest’anno ho lavorato su un progetto riguardante lo sviluppo della parte di backend di una piattaforma che permetteva la gestione di un impianto. Le tecnologie utilizzate le conoscevo già, ma abbiamo utilizzato un pattern che non avevo mai visto prima: Command and Query.

All’inizio ho pensato che fosse una complessità inutile, ma appena capito è risultato semplicissimo. In sostanza questo pattern (nome completo Command and Query Responsibility Segregation – CQRS) disaccoppia le operazioni di lettura e scrittura per migliorare le prestazione e la scalabilità di un sistema:

  • Command: è l’operazione che modifica lo stato del sistema e generalmente non restituisce un risultato (al massimo può comunicare che l’operazione è stata completata con successo);
  • Query: è l’operazione che permette di leggere i dati presenti nel sistema e non deve modificare lo stato del sistema.

Il disaccoppiamento dei due tipi di operazioni implica l’esistenza di modelli di dati e logiche differenti.

CRQS è più adatto per sistemi molto grossi che gestiscono un alto livello di letture/scritture perché richiede l’aggiunta di una complessità che per sistemi di dimensioni ridotte può essere un po’ “overkill” 😀

Perchè usare questo pattern?

Scalabilità. Ottimizza le operazioni di lettura o viceversa, senza andare ad intaccare l’altro insieme di operazioni.

Performance. Separa i due tipi di operazioni: permette alle query di usare metodi di accesso ai dati più veloci e ai comandi di mettere il focus sull’integrità del dato.

Complessità e testabilità. Suddividendo le operazioni, vengono suddivise anche le casistiche da implementare, rendendo l’applicazione modulare. Quest’ultima feature semplifica anche la testabilità dell’applicazione in quanto si testano le singole casistiche.

Autorizzazioni. Permette di dare permessi diversi alle varie utenze del sistema, suddividendo chi può leggere da chi può scrivere.

Vuoi approfondire l’argomento? 

Esplora Microsoft Learn per maggiori informazioni.

ItalyEnglishFrenchGerman