Sdílet prostřednictvím


Použití přístupů CQRS a CQS v mikroslužbě DDD v eShopOnContainers

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.

Návrh mikroslužby řazení v referenční aplikaci eShopOnContainers je založen na principech CQRS. Používá ale nejjednodušší přístup, který pouze odděluje dotazy od příkazů a používá stejnou databázi pro obě akce.

Podstatou těchto vzorů a tady důležitý bod je, že dotazy jsou idempotentní: bez ohledu na to, kolikrát dotazujete systém, stav tohoto systému se nezmění. Jinými slovy, dotazy jsou zdarma s vedlejším účinkem.

Proto byste mohli použít jiný datový model pro čtení než doménový model transakční logiky zápisů, i když objednávání mikroslužeb používá stejnou databázi. Proto se jedná o zjednodušený přístup CQRS.

Na druhou stranu příkazy, které aktivují transakce a aktualizace dat, mění stav v systému. S příkazy musíte být opatrní při řešení složitosti a neustále se měnících obchodních pravidel. Tady chcete použít techniky DDD pro lepší modelovaný systém.

Vzory DDD uvedené v této příručce by se neměly používat universálně. Představují omezení vašeho návrhu. Tato omezení poskytují výhody, jako je vyšší kvalita v průběhu času, zejména v příkazech a dalším kódu, který upravuje stav systému. Tato omezení ale přidají složitost s menším počtem výhod při čtení a dotazování dat.

Jedním z takových vzorů je agregační vzor, který prozkoumáme v dalších částech. Stručně řečeno, v agregačním vzoru považujete mnoho objektů domény za jednu jednotku jako výsledek jejich vztahu v doméně. V dotazech nemusíte vždy získávat výhody tohoto modelu; může zvýšit složitost logiky dotazu. U dotazů jen pro čtení nezískute výhody zacházení s více objekty jako s jednou agregací. Získáte jen složitost.

Jak je znázorněno na obrázku 7–2 v předchozí části, tato příručka navrhuje používat vzory DDD pouze v oblasti transakční/aktualizace mikroslužby (to znamená, že aktivované příkazy). Dotazy můžou postupovat podle jednoduššího přístupu a měly by být oddělené od příkazů, a to pomocí přístupu CQRS.

Pro implementaci "na straně dotazů" si můžete vybrat mezi mnoha přístupy, od plně vykouřených ORM, jako jsou EF Core, projekce automatického mapování, uložené procedury, zobrazení, materializovaná zobrazení nebo mikro ORM.

V této příručce a v eShopOnContainers (konkrétně v mikroslužbě objednávání) jsme se rozhodli implementovat rovné dotazy pomocí mikro ORM, jako je Dapper. Tato příručka umožňuje implementovat jakýkoli dotaz založený na příkazech SQL, abyste získali nejlepší výkon díky light frameworku s malou režií.

Při použití tohoto přístupu potřebují všechny aktualizace modelu, které mají vliv na to, jak se entity uchovávají v databázi SQL, také samostatné aktualizace dotazů SQL používaných Dapperem nebo jinými samostatnými přístupy (mimo EF) k dotazování.

Vzory CQRS a DDD nejsou architektury nejvyšší úrovně.

Je důležité si uvědomit, že CQRS a většina vzorů DDD (jako jsou vrstvy DDD nebo doménový model s agregacemi) nejsou styly architektury, ale pouze vzory architektury. Příkladem stylů architektury jsou mikroslužby, SOA a architektura řízená událostmi (EDA). Popisují systém mnoha komponent, například mnoho mikroslužeb. Vzory CQRS a DDD popisují něco uvnitř jednoho systému nebo komponenty; v tomto případě něco uvnitř mikroslužby.

Různé vázané kontexty (BCS) budou používat různé vzory. Mají různé odpovědnosti a vedou k různým řešením. Stojí za to zdůraznit, že vynucení stejného vzoru všude vede k selhání. Nepoužívejte vzory CQRS a DDD všude. Mnoho subsystémů, řadičů základní desky nebo mikroslužeb je jednodušší a je možné je implementovat snadněji pomocí jednoduchých služeb CRUD nebo jiným přístupem.

Existuje pouze jedna architektura aplikace: architektura systému nebo ucelené aplikace, kterou navrhujete (například architektura mikroslužeb). Návrh každého vázaného kontextu nebo mikroslužby v rámci této aplikace ale odráží své vlastní kompromisy a interní rozhodnutí o návrhu na úrovni vzorů architektury. Nepokoušejte se použít stejné architektonické vzory jako CQRS nebo DDD všude.

Další materiály