Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Suggerimento
Questo contenuto è un estratto dell'eBook, Architettura di microservizi .NET per applicazioni .NET containerizzati, disponibile in documentazione .NET o come PDF scaricabile gratuitamente leggibile offline.
CQRS è un modello di architettura che separa i modelli per la lettura e la scrittura di dati. Il termine relativo Command Query Separation (CQS) è stato originariamente definito da Language Meyer nel suo libro Object-Oriented Software Construction. L'idea di base è che è possibile dividere le operazioni di un sistema in due categorie ben separate:
Query. Queste query restituiscono un risultato e non modificano lo stato del sistema e sono privi di effetti collaterali.
Comandi. Questi comandi modificano lo stato di un sistema.
CQS è un concetto semplice: riguarda metodi all'interno dello stesso oggetto che sono classificati come query o comandi. Ogni metodo restituisce lo stato o modifica lo stato, ma non entrambi. Anche un singolo oggetto modello di repository può essere conforme a CQS. CQS può essere considerato un principio fondamentale per CQRS.
Command and Query Responsibility Segregation (CQRS) è stato introdotto da Greg Young e fortemente promosso da Udi Dahan e altri. Si basa sul principio CQS, anche se è più dettagliato. Può essere considerato un modello basato su comandi ed eventi e facoltativamente sui messaggi asincroni. In molti casi, CQRS è correlato a scenari più avanzati, ad esempio la presenza di un database fisico diverso per le letture (query) rispetto alle scritture (aggiornamenti). Inoltre, un sistema CQRS più evoluto potrebbe implementare Event-Sourcing (ES) per il database degli aggiornamenti, in modo da archiviare solo gli eventi nel modello di dominio anziché archiviare i dati dello stato corrente. Tuttavia, questo approccio non viene usato in questa guida. Questa guida usa l'approccio CQRS più semplice, che consiste nel separare le query dai comandi.
L'aspetto di separazione di CQRS viene ottenuto raggruppando le operazioni di query in un livello e comandi in un altro livello. Ogni livello ha un proprio modello di dati (si noti che parliamo di modello di dati, non necessariamente di un database diverso) e viene costruito utilizzando una combinazione specifica di pattern e tecnologie. Più importante, i due livelli possono trovarsi all'interno dello stesso livello o microservizio, come nell'esempio (microservizio di ordinamento) usato per questa guida. Oppure possono essere implementati in microservizi o processi diversi in modo che possano essere ottimizzati e ridimensionati separatamente senza influire l'uno sull'altro.
CQRS significa avere due oggetti per un'operazione di lettura/scrittura in cui in altri contesti ne esiste uno. Vi sono motivi per avere un database di lettura denormalizzato, di cui puoi apprendere nella letteratura CQRS più avanzata. Tuttavia, in questo caso non viene usato questo approccio, in cui l'obiettivo è avere maggiore flessibilità nelle query anziché limitare le query con vincoli da modelli DDD come aggregazioni.
Un esempio di questo tipo di servizio è il microservizio di ordinamento dell'applicazione di riferimento eShopOnContainers. Questo servizio implementa un microservizio basato su un approccio CQRS semplificato. Usa una singola origine dati o un database, ma due modelli logici più modelli DDD per il dominio transazionale, come illustrato nella figura 7-2.
Figura 7-2. Microservizio semplificato basato su CQRS e DDD
Il microservizio logico "Ordinamento" include il database di ordinamento, che può essere, ma non deve essere, lo stesso host Docker. La presenza del database nello stesso host Docker è utile per lo sviluppo, ma non per la produzione.
Il livello dell'applicazione può essere l'API Web stessa. L'aspetto di progettazione importante è che il microservizio ha suddiviso le query e ViewModels (modelli di dati creati appositamente per le applicazioni client) dai comandi, dal modello di dominio e dalle transazioni in base al modello CQRS. Questo approccio mantiene le query indipendenti dalle restrizioni e dai vincoli provenienti da modelli DDD che hanno senso solo per le transazioni e gli aggiornamenti, come illustrato nelle sezioni successive.
Risorse aggiuntive
- Greg Young. Versionamento in un sistema basato su eventi (Gratuito per leggere l'e-book online)
https://leanpub.com/esversioning/read