Sdílet prostřednictvím


Použití zjednodušených vzorů CQRS a DDD v mikroslužbě

Návod

Tento obsah je výňatek z eBooku, architektury mikroslužeb .NET pro kontejnerizované aplikace .NET, které jsou k dispozici na .NET Docs nebo jako zdarma ke stažení PDF, které lze číst offline.

eBook o architektuře mikroslužeb .NET pro kontejnerizované aplikace .NET, miniatura na obálce.

CQRS je model architektury, který odděluje modely pro čtení a zápis dat. Související termín Command Query Separation (CQS) byl původně definován Bertrand Meyer ve své knize Object-Oriented Software Construction. Základní myšlenkou je, že operace systému můžete rozdělit do dvou ostře oddělených kategorií:

  • Dotazy. Tyto dotazy vrátí výsledek a nezmění stav systému a neobsahují vedlejší účinky.

  • Příkazy. Tyto příkazy mění stav systému.

CQS je jednoduchý koncept: jedná se o metody ve stejném objektu, jako jsou dotazy nebo příkazy. Každá metoda buď vrátí stav, nebo mění stav, ale ne obojí. I jeden objekt vzoru úložiště může vyhovovat CQS. CQS lze považovat za základní princip pro CQRS.

Command and Query Responsibility Segregation (CQRS) představil Greg Young a důrazně jej propagoval Udi Dahan a další. Je založená na principu CQS, i když je podrobnější. Dá se považovat za vzor založený na příkazech a událostech a volitelně i na asynchronních zprávách. V mnoha případech souvisí CQRS s pokročilejšími scénáři, jako je například jiná fyzická databáze pro čtení (dotazy) než pro zápisy (aktualizace). Vývojový systém CQRS navíc může implementovat Event-Sourcing (ES) pro vaši databázi aktualizací, takže místo ukládání dat aktuálního stavu byste do doménového modelu ukládeli pouze události. Tento přístup se ale v této příručce nepoužívá. Tato příručka používá nejjednodušší přístup CQRS, který se skládá jenom z oddělení dotazů od příkazů.

Aspekt oddělení CQRS se dosahuje seskupením operací dotazů v jedné vrstvě a příkazy v jiné vrstvě. Každá vrstva má svůj vlastní datový model (všimněte si, že model, ne nutně jiná databáze) a sestavuje se pomocí vlastní kombinace vzorů a technologií. Důležitější je, že tyto dvě vrstvy můžou být ve stejné vrstvě nebo mikroslužbě, jako v příkladu (řazení mikroslužeb) používané pro tuto příručku. Nebo je můžete implementovat v různých mikroslužbách nebo procesech, aby je bylo možné optimalizovat a škálovat samostatně, aniž by to mělo vliv na sebe navzájem.

CQRS znamená, že mají dva objekty pro operaci čtení a zápisu, kde v jiných kontextech existuje jeden. Existují důvody pro použití denormalizované databáze pro čtení, o kterých se můžete dozvědět v pokročilé literatuře CQRS. Tento přístup zde ale nepoužíváme, protože cílem je mít větší flexibilitu v dotazech místo omezení ze vzorů DDD, jako jsou agregace.

Příkladem tohoto typu služby je objednání mikroslužby z referenční aplikace eShopOnContainers. Tato služba implementuje mikroslužbu na základě zjednodušeného přístupu CQRS. Používá jeden zdroj dat nebo databázi, ale dva logické modely plus vzory DDD pro transakční doménu, jak je znázorněno na obrázku 7–2.

Diagram znázorňující zjednodušenou mikroslužbu CQRS a DDD na vysoké úrovni

Obrázek 7–2 Zjednodušená mikroslužba založená na CQRS a DDD

Logická mikroslužba "Ordering" zahrnuje svou databázi objednávek, která může, ale nemusí být na stejném hostiteli Dockeru. Databáze ve stejném hostiteli Dockeru je vhodná pro vývoj, ale ne pro produkční prostředí.

Aplikační vrstva může být samotné webové rozhraní API. Důležitým aspektem návrhu je, že mikroslužba rozdělí dotazy a modely ViewModel (zejména datové modely vytvořené pro klientské aplikace) z příkazů, doménového modelu a transakcí za vzorem CQRS. Tento přístup udržuje dotazy nezávislé na omezeních a omezeních pocházejících ze vzorů DDD, které mají smysl pouze pro transakce a aktualizace, jak je vysvětleno v dalších částech.

Dodatečné zdroje