CQRS è un pattern che separa le responsabilità tra comandi (Commands) e query (Queries). Il comando modifica lo stato del sistema, mentre la query si limita a leggere i dati. Spesso per queste attività vengono progettati modelli di dati diversi e interfacce separate.
Vantaggio di CQRS: consente di ottimizzare i processi di accesso ai dati per lettura e scrittura separatamente, aumentando le prestazioni dei sistemi complessi, facilitando la scalabilità e l'ottimizzazione per diversi scenari di carico.
Esempio di codice (CQRS utilizzando C#):
interface ICommand { } interface IQuery<TResult> { } class CreateOrderCommand : ICommand { public int OrderId { get; set; } } class GetOrderQuery : IQuery<Order> { public int OrderId { get; set; } } class OrderCommandHandler { public void Handle(CreateOrderCommand command) { // Modifica nel DB } } class OrderQueryHandler { public Order Handle(GetOrderQuery query) { // Lettura dei dati dal DB senza modifiche return new Order(); } }
Caratteristiche principali:
È CQRS una versione di CRUD, separata in due classi?
No, CQRS è di più rispetto a una semplice separazione dei metodi. Di solito si creano modelli separati, strutture dati e interfacce per la parte di lettura e quella di comando, spesso si utilizzano database diversi.
È CQRS adatto a tutti i progetti?
No. L'implementazione di CQRS ha senso solo per sistemi complessi e scalabili con elevate esigenze di prestazioni e indipendenza del trattamento. Per piccoli progetti è spesso eccessivo.
È CQRS una garanzia di eventual consistency (coerenza finale)?
Non necessariamente. CQRS può essere implementato con eventual consistency in sistemi distribuiti, ma il pattern in sé non offre questa garanzia.