Rok temu pisa­łem o wzor­cu CQRS, tam­ten wpis bazo­wał głów­nie na arty­ku­le M.Fowlera i sta­no­wił raczej zajaw­kę tema­tu. Teraz mam trosz­kę wła­snych doświad­czeń, tak­że w dys­ku­sjach z pro­gra­mi­sta­mi, i przy­to­czę tu moja kon­klu­zję, nie­co chy­ba odbie­ga­ją­cą od opi­su M.Fowlera, któ­re­go albo nie zro­zu­mia­łem ale on upro­ścił swój wpis (dzię­ki cze­mu ja wte­dy nie zrozumiałem).

Mamy pro­blem pole­ga­ją­cy na tym, że fir­ma ma ogrom­ną ofer­tę pew­nych bar­dzo zło­żo­nych pod­ze­spo­łów, żeby nie psuć ich opi­su i moż­li­wo­ści roz­bu­do­wy, model dzie­dzi­ny odwzo­ro­wu­je struk­tu­rę tych czę­ści. Jednak bar­dzo duża licz­ba użyt­kow­ni­ków skle­pu inter­ne­to­we­go regu­lar­nie przy­wo­łu­je na ekran listę pod­ze­spo­łów w posta­ci cen­ni­ka, peł­ne­go, stro­ni­co­wa­ne­go, sor­to­wa­ne­go alfa­be­tycz­nie lub ceną.

Rozwiązanie: repo­zy­to­rium prze­trzy­mu­je dwa kom­ple­ty tych danych: jeden jako peł­ny kata­log danych o pro­duk­tach dru­gi jako pła­ski cen­nik. bar­dzo czę­sto spo­ty­kam się z opi­nia (imple­men­ta­cją), w któ­rej (np. za pomo­cą ORM) mapu­je się model (pro­jekt) logicz­ny na bazę danych w spo­sób jak poniżej:

CQRS 1

Prawdopodobnie dla­te­go, że na stro­nie http://​mar​tin​fow​ler​.com/​b​l​i​k​i​/​C​Q​R​S​.​h​tml mamy taki oto dia­gram opi­su­ją­cy wzo­rzec CQRS:

cqrs

i to jest ten moment, w któ­rym ja chy­ba cze­goś nie zro­zu­mia­łem u Fowlera (i nie tyl­ko u nie­go). W moim mnie­ma­niu (i w mojej wer­sji w pro­jek­tach) wyglą­da to jed­nak tak:

CQRS 2

Czyli z zewnątrz” mamy RepozytoriumPodzespołów (jeden inter­fejs) a logi­ka jest taka: na bazie kolek­cji agre­ga­tów powsta­je rów­no­le­gle (jest aktu­ali­zo­wa­na okre­so­wo) nie­za­leż­na pła­ska lista. Korzystający z tego kom­po­nen­tu – wyko­nu­jąc ope­ra­cje podajCennik() – nie wie, czy cen­nik jest gene­ro­wa­ny wprost z agre­ga­tów czy z pła­skiej tabli­cy, bo to jest ukry­te za inter­fej­sem. Jednak, jak nie trud­no się domy­śleć, odpo­wiedź z kolek­cji ProstyopisPodzespołów będzie o nie­bo” szyb­sza niż ad-hoc zapy­ta­nie do kolek­cji bar­dzo zło­żo­nych agre­ga­tów. Agregaty prak­tycz­nie wyłącz­nie obsłu­gu­ją ope­ra­cje CRUD. Warunkiem uzy­ska­nia dużej wydaj­no­sci ope­ra­cji podajCennik() jest, pro­jek­tu­jąc utrwa­la­nie, zbu­do­wa­nie dwóch odręb­nych zesta­wów tablic dla agre­ga­tów i dla pła­skiej kolekcji.

Jarosław Żeliński

Jarosław Żeliński: autor, badacz i praktyk analizy systemowej organizacji: Od roku 1991 roku, nieprzerwanie, realizuje projekty z zakresu analiz i projektowania systemów, dla urzędów, firm i organizacji. Od 1998 roku prowadzi samodzielne studia i prace badawcze z obszaru analizy systemowej i modelowania (modele jako przedmiot badań: ORCID). Od 2005 roku, jako nieetatowy wykładowca akademicki, prowadzi wykłady i laboratoria (ontologie i modelowanie systemów informacyjnych, aktualnie w Wyższej Szkole Informatyki Stosowanej i Zarządzania pod auspicjami Polskiej Akademii Nauk w Warszawie.) Oświadczenia: moje badania i publikacje nie mają finansowania z zewnątrz, jako ich autor deklaruję brak konfliktu interesów. Prawa autorskie: Zgodnie z art. 25 ust. 1 pkt. 1) lit. b) ustawy o prawie autorskim i prawach pokrewnych zastrzegam, że dalsze rozpowszechnianie artykułów publikowanych w niniejszym serwisie jest zabronione bez indywidualnej zgody autora (patrz Polityki Strony).

Ten post ma 5 komentarzy

  1. Sławomir Sobótka

    W CqRS cho­dzi o to aby odse­pa­ro­wać od sie­bie 2 kla­sy ope­ra­cji: roz­ka­zy kie­ro­wa­ne do dome­ny i kwe­ren­dy słu­żą­ce do pod­glą­da­nia” sta­nu domeny.

    Robimy to w celu:
    – zorien­to­wa­nia API sto­su com­mand na bar­dziej induk­tyw­ne niż crudowe
    – zwra­ca­nia ze sto­su query mode­lu, któ­ry będzie bar­dziej odpo­wied­ni do pre­zen­ta­cji niż dome­na (w apli­ka­cjach, któ­re nie są pro­stym cru­dem model dome­no­wy może nie nada­wać się do pre­zen­ta­cji, szcze­gól­nie na prze­kro­jo­wych raportach/tabelkach)
    – her­me­ty­za­cji dome­ny (nie chce­my aby apli­ka­cje klienc­kie wie­dzia­ły” o naszych tajem­ni­cach domenowych
    – przy oka­zji może­my ugrać” nie­co tech­nicz­nych bonu­sów” typu wydaj­ność, ska­lo­wa­nie, osob­ne cykle deploy­men­tu, podej­ście aspek­to­we po stro­nie sto­su command

    Natomiast to jak to jest zaim­ple­men­to­wa­ne, to już spra­wa dru­go­rzęd­na. Możemy podejść do pro­ble­mu na kil­ka sposobów.
    – stos query spłasz­cza” model dome­no­wy przy pomo­cy SQL: w sto­sie com­mand uży­wa­my ORM, któ­ry świet­nie nada­je się do ope­ro­wa­niu na Agregatach DDD, ale nie nada­je się kom­plet­nie do prze­kro­jo­wych kwerend
    – wido­ki zma­te­ria­li­zo­wa­ne – stos query jest wido­kiem na dome­nę; gene­ral­nie pro­je­kuy­ej­my mode­le danych rela­cyj­nych dążąc do III posta­ci nor­mal­nej (któ­ra jest dosko­na­ła do zapi­su, ale sła­ba do odczy­tu), pod­czas gdy więk­szość sys­te­mów biz­ne­so­wych czę­ściej czy­ta niż pisze do bazy (3 – 5 rzę­dów wiel­ko­ści częściej)
    – osob­ny model do odczy­tu, któ­ry jest odświe­ża­ny np. przy pomo­cy zda­rzeń gene­ro­wa­nych przez obiek­ty dome­no­we w waż­nym momen­tach ich życia; tych osob­nych mode­li do odczy­tu może być wie­le (w zależ­no­ści od potrzeb) i mogą być zaim­ple­men­to­wa­ne na bazach innych niż rela­cyj­ne, ta, gdzie ma to sens, np bazy gra­fo­we w przy­pad­ku gdy chce­my mode­lo­wać np. gra­fy powią­zań w sie­ci klientów.

    Generalnie: waż­ne aby zacząć od sepa­ra­cji API pro­jek­tu­jąc 2 sto­sy warstw. Z cza­sem wraz ze wzro­stem obcią­że­nia może­my zmie­niać impl prze­cho­dząc przez kolej­ne pozio­my sepa­ra­cji technicznej.

    1. Jaroslaw Zelinski

      No tak. Ale to co opi­sa­łem to fak­tycz­nie kon­kret­ne roz­wią­za­nie, ale z per­spek­ty­wy mojej” (to jest cel uży­cia w pro­jek­cie) cele są dwa (powią­za­ne ze sobą):
      – zwięk­szyć wydaj­ność ope­ra­cji pokaż cennik”,
      – unik­nąć (zabro­nić) opty­ma­li­za­cji meto­dą uprasz­cza­nia agre­ga­tów (czy­li psu­cia pro­jek­tu), któ­re fak­tycz­nie (wier­nie) mode­lu­ją ele­men­ty dziedzinowe.
      Innymi sło­wy agre­ga­ty wier­nie odwzo­ro­wu­ją realia, pła­ska tabli­ca (moż­li­we, że wię­cej) peł­ni rolę meto­dy szyb­kie­go dostę­pu do kon­kret­ne­go sto­so­wa­ne­go wido­ku danych uproszczonych.
      Traktuje to (dodat­ko­wa pła­ska kolek­cja) jak pod­ręcz­ny, pro­sty zeszy­cik maga­zy­nie­ra, któ­ry słu­ży wyłącz­nie do szyb­kie­go zna­le­zie­nia pro­duk­tu a nie do czer­pa­nia infor­ma­cji o nim.

  2. Sławomir Sobótka

    Ok, już rozu­miem, bo nawet mi przez myśl nie prze­szło, że ktoś może chcieć psuć model agregatów:)

    1. Jaroslaw Zelinski

      A zdzi­wił byś się 🙂 jak czę­sto jest to robione.…

Dodaj komentarz

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.