CQRS

S Vikipedije, slobodne enciklopedije

The Command and Query Responsibility Segregation (CQRS) - princip ili patern čijom primenom se razdvajaju operacije koje menjaju podatke od operacija koje služe za čitanje podataka.

Patern CQRS primenjuje princip imperativnog programiranja razdvajanja komandi i upita - sommand-query separation (CQS). Operacije menjanja podataka nazivamo komandama (commands) dok operacije čitanja nazivamo upitima (queries). CQS je uveden Bertrand Meyer-om za vreme rada nad programskim jezikom Eiffel. Princip glasi da metoda mora biti ili komandom koja vrši neku radnju ili upitom koji vraća podatke, ali ne može istovremeno biti jedno i drugo. Drugim rečima upit ne može da menja odgovor a komanda ne dobija odgovor.[1]

Tradicionalna arhitektura[uredi | uredi izvor]

U tradicionalnim arhitekturama, isti model podataka se koristi za upite i ažuriranje baze podataka. To je jednostavno i dobro funkcioniše za osnovne CRUD operacije. U složenijim aplikacijama, međutim, ovaj pristup može postati nezgrapan. Na primer, na strani za čitanje, aplikacija može da izvrši mnogo različitih upita, vraćajući objekte za prenos podataka (DTO) različitih oblika. Mapiranje objekata može postati komplikovano. Na strani pisanja, model može implementirati složenu validaciju i poslovnu logiku. Kao rezultat toga, možete završiti sa previše složenim modelom koji radi previše.[2] Vremenom količina podataka raste, a vreme izvršavanja upita se, usled njihove kompleksnosti, obično povećava po nekoj zakonitosti zavisnoj od količine podataka. Takođe, usled korišćenja zajedničkog modela za upis i čitanje a samim tim i zajedničke baze koja je usko grlo, sistem obično može samo da skalira vertikalno (npr. korišćenjem više memorije ili povećanjem procesorske moći), što znači da je ograničeno i skupo a vrlo brzo dolazi do trenutka kad više nije moguće proširenje. [3] Radna opterećenja čitanja i pisanja su često asimetrična, sa veoma različitim zahtevima za performansama i vertikalnim maštabianjem.[2]

Rešenje[uredi | uredi izvor]

CQRS razdvaja čitanje i pisanje u različite modele, koristeći komande za ažuriranje podataka i upite za čitanje podataka. Posedovanje zasebnih modela upita i ažuriranja pojednostavljuje dizajn i implementaciju. Međutim, jedan nedostatak je što se CQRS kod ne može automatski generisati iz šeme baze podataka koristeći mehanizme kao što su O/RM alati.[2] Pošto su definisani razdvojeni interfejsi ka korisničkom interfejsu (ili nekom drugom sistemu) za upis i čitanje, moguće je koristiti i različite modele. Iako se ista baza podataka koristi i u jednom i u drugom modelu, postoji mogućnost da se koriste posebni prikazi koje nudi sama baza podataka.[3] CQRS koristi dva modela podataka: jedan za čitanje unosa i drugi za mutirajuće stanje. CQRS podstiče asinhrono generisanje materijalizovanih pogleda koji su posebno dizajnirani i optimizovani za rukovanje bilo kojim složenim upitima.[4]

Zasebne baze podataka[uredi | uredi izvor]

Pored zasebnih softverskih komponenti, vrlo često se ove dve grane i pripremaju za odvojenu instalaciju baze podataka kako bi mogle i odvojeno da skaliraju. Najčešće je potreba za čitanjem podataka dosta veća, a ta asimetričnost može da se oslikava i u skaliranju komponenti sistema.

Command Handler prihvata komandu i primenjuje je nad modelom za upis podataka. Model za upis na osnovu komande i trenutnog stanja resursa, može da napravi obaveštenja (events) i objavi ih sinhrono ili asinhrono koristeći razne principe i tehnike, a koje će da se upotrebe za sinhronizaciju podataka između modela za upravljanje komandama i baza koje su podrška modelu za čitanje i prikaz podataka.

Najveća prednost ovakvog pristupa jeste mogućnost korišćenja baza podataka koja najviše odgovara modelu koji je koristi. Za model za čitanje podataka mogu da se razmotre različite tehnike za smeštanje podataka uključujći upotrebu relacionih, NoSQL, Full Text Search, Graph, Distributed Cache i drugih baza i alata. Takođe, sam razvoj aplikacije bez zajedničkog modela može da obavlja više timova.[3]

Poznati problemi CQRS[uredi | uredi izvor]

Sve gore navedene prednosti omogućavaju da se servisi skaliraju mnogo više od tradicionalnog rešenja zasnovanog na RDBMS -u. Međutim, postoje kompromisi za korišćenje ove tehnike:[4]

  • Pošto se skladište upita popunjava asinhrono, podaci na kraju postaju konzistentni.
  • Sistem može da izgubi svojstva ACID transakcije. Međutim, razvijene su različite korisne tehnike za rukovanje transakcijskim zahtevima bez ACID -a.
  • Troškovi skladištenja se povećavaju kako se održava više kopija podataka.
  • Potrebna je dodatna infrastruktura.

CQRS i Event Sourcing[uredi | uredi izvor]

CQRS obrazac se često koristi zajedno sa Event Sourcing paternom. Sistemi zasnovani na CQRS-u koriste odvojene modele podataka za čitanje i pisanje, od kojih je svaki prilagođen relevantnim zadacima i često se nalazi u fizički odvojenim skladištima. Kada se koristi sa šablonom Event Sourcing, skladište događaja je model pisanja i zvanični je izvor informacija. Model čitanja sistema zasnovanog na CQRS -u pruža materijalizovane prikaze podataka, obično kao visoko denormalizovane poglede. Ovi prikazi su prilagođeni interfejsima i zahtevima za prikaz aplikacije, što pomaže da se maksimiziraju performanse prikaza i upita. Model se time dodatno komplikuje, međutim u nekim slučajevima i procesima koje aplikacija treba da podrži, dobijaju se razne pogodnosti, pre svega:

  • Jednostavniji upis u komandnom modelu. Npr. nema blokiranja upisa i zaključavanja entiteta u bazi kad više korisnika istovremeno menja iste podatke
  • Ponovni pregled događaja koji su prethodili nekom trenutku
  • Reprodukcija događaja i izračunavanje stanja do nekog trenutka kako bi se obezbedili podaci za model za prikaz podataka, bilo da je neka nova baza za čitanje ili korekcije na postojećoj, prikupljanje podataka za neke druge alate, npr. za statistiku, predikciju, obradu uz pomoć veštačke inteligencije i sl.

Reference[uredi | uredi izvor]

  1. ^ CQRS (na jeziku: ruski), 2023-02-05, Pristupljeno 2023-12-20 
  2. ^ a b v martinekuan. „CQRS pattern - Azure Architecture Center”. learn.microsoft.com (na jeziku: engleski). Pristupljeno 2023-12-20. 
  3. ^ a b v „Bolje performanse i skalabilnost uz primenu CQRS-a | ITkonekt” (na jeziku: srpski). 2019-07-17. Pristupljeno 2023-12-20. 
  4. ^ a b Modi, Kanika (2022-06-11). „CQRS Design Pattern — 5 Things You Should Know”. CodeX (na jeziku: engleski). Pristupljeno 2023-12-20.