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

Tip

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.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

CQRS je model architektury, který odděluje modely pro čtení a zápis dat. Související termín Oddělení příkazů dotazu (CQS) byl původně definován Bertrand Meyer v jeho 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 ztlumí 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.

Greg Young a důrazně 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). Kromě toho může vývojový systém CQRS implementovat model Event-Sourcing (ES) pro vaši databázi aktualizací, takže byste místo ukládání dat aktuálního stavu ukládeli události pouze do doménového modelu. 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č mít denormalizovaná databáze čtení, o které se můžete dozvědět v pokročilejší dokumentaci 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 showing a high level Simplified CQRS and DDD microservice.

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

Logická mikroslužba ordering zahrnuje svou databázi objednávek, což může být, ale nemusí být stejný hostitel 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.

Další materiály