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ó.
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.
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
- Greg Young. Verziószámozás eseményforrású rendszerben (Ingyenesen olvasható online e-könyv)
https://leanpub.com/esversioning/read