Megosztás a következőn keresztül:


Egyszerűsített CQRS- és DDD-minták alkalmazása egy mikroszolgáltatásban

Tipp.

Ez a tartalom egy részlet a .NET-alkalmazásokhoz készült .NET-alkalmazásokhoz készült eBook, .NET Microservices Architecture című eBookból, amely elérhető a .NET Docs-on vagy egy ingyenesen letölthető PDF-fájlként, amely offline módban is olvasható.

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

A CQRS egy architekturális minta, amely elválasztja az adatok olvasására és írására szolgáló modelleket. A command query separation (CQS) kifejezést eredetileg Bertrand Meyer definiálta az Objektumorientált szoftverépítés című könyvében. Az alapötlet az, hogy a rendszer műveleteit két élesen egymástól elválasztott kategóriára oszthatja:

  • Lekérdezések. Ezek a lekérdezések eredményt adnak vissza, és nem módosítják a rendszer állapotát, és nincsenek mellékhatásaik.

  • Parancsok. Ezek a parancsok megváltoztatják a rendszer állapotát.

A CQS egy egyszerű fogalom: az ugyanazon objektumon belüli metódusokról szól, akár lekérdezésekről, akár parancsokról. Minden metódus vagy állapotot ad vissza, vagy az állapotot mutálja, de mindkettőt nem. A CQS-nek még egyetlen adattárminta-objektum is megfelelhet. A CQS a CQRS alapvető alapelvének tekinthető.

A command and Query Responsibility Szegregációt (CQRS) Greg Young vezette be, és Udi Dahan és mások határozottan támogatták. Ez a CQS elvén alapul, bár részletesebb. A parancsokon és eseményeken, valamint opcionálisan aszinkron üzeneteken alapuló mintának tekinthető. A CQRS sok esetben speciálisabb forgatókönyvekhez kapcsolódik, például olvasási (lekérdezési) fizikai adatbázissal rendelkezik, mint az írásokhoz (frissítésekhez). Emellett egy fejlettebb CQRS-rendszer implementálhatja az Event-Sourcing (ES) rendszert a frissítési adatbázishoz, így az aktuális állapotadatok tárolása helyett csak a tartománymodellben tárolna eseményeket. Ez a megközelítés azonban nem használható ebben az útmutatóban. Ez az útmutató a legegyszerűbb CQRS megközelítést használja, amely a lekérdezések parancsoktól való elválasztását foglalja magában.

A CQRS elkülönítési aspektusa úgy érhető el, hogy a lekérdezési műveleteket az egyik rétegben, a parancsokat pedig egy másik rétegben csoportosítja. Minden rétegnek saját adatmodellje van (ne feledje, hogy a modell nem feltétlenül egy másik adatbázis), és a minták és technológiák saját kombinációjával készült. Ennél is fontosabb, hogy a két réteg ugyanabban a rétegben vagy mikroszolgáltatásban lehet, mint az ebben az útmutatóban használt példában (mikroszolgáltatás megrendelése). Vagy implementálhatók különböző mikroszolgáltatásokon vagy folyamatokon, hogy egymás befolyásolása nélkül optimalizálhatók és skálázhatók legyenek.

A CQRS azt jelenti, hogy egy olvasási/írási művelethez két objektum tartozik, ahol más környezetekben van egy. A denormalizált olvasási adatbázisnak több oka is van, amelyekről részletesebb CQRS-szakirodalomban olvashat. Itt azonban nem ezt a megközelítést használjuk, ahol a cél az, hogy nagyobb rugalmasság legyen a lekérdezésekben ahelyett, hogy a DDD-minták, például az aggregátumok korlátaival korlátozná a lekérdezéseket.

Ilyen típusú szolgáltatás például az eShopOnContainers referenciaalkalmazásból származó mikroszolgáltatás megrendelése. Ez a szolgáltatás egyszerűsített CQRS-megközelítésen alapuló mikroszolgáltatást implementál. Egyetlen adatforrást vagy adatbázist használ, de két logikai modellt, valamint a tranzakciós tartomány DDD-mintáit, a 7–2. ábrán látható módon.

Diagram showing a high level Simplified CQRS and DDD microservice.

7-2. ábra. Egyszerűsített CQRS- és DDD-alapú mikroszolgáltatás

A logikai "Ordering" mikroszolgáltatás tartalmazza a Rendelési adatbázist, amely lehet, de nem kell ugyanaz a Docker-gazdagép. Ha az adatbázis ugyanabban a Docker-gazdagépben van, az fejlesztésre jó, éles környezetben azonban nem.

Az alkalmazásréteg lehet maga a webes API. A fontos tervezési szempont itt az, hogy a mikroszolgáltatás felosztotta a lekérdezéseket és a ViewModel-eket (különösen az ügyfélalkalmazásokhoz létrehozott adatmodelleket) a parancsoktól, a tartománymodelltől és a tranzakcióktól a CQRS-mintát követve. Ezzel a módszerrel a lekérdezések függetlenek maradnak a DDD-mintákból eredő korlátozásoktól és korlátozásoktól, amelyek csak a tranzakciók és frissítések szempontjából értelmezhetők, a későbbi szakaszokban leírtak szerint.

További erőforrások