Command Query Responsibility Segregation qısa şəkildə isə CQRS əsas məqsədi  write (yazma) və read (oxuma) əməliyyatlarının ayrılmasına əsaslanan bir arxitektural dizayn modelidir. CQRS -in əsasını Command Query Separation (CQS) təşkil edir. CQS ilk dəfə Bertrand Mayer tərəfindən onun Eiffel proqramlaşdırma dili ilə üzərində işlədiyi bir proyektdə ərsəyə gəlmişdir.  CQS-ə əsasən hər method ya hər hansı bir vəzifəni yerinə yetirən command-dan ibarət olmalı, ya da lazımı datanı götürmək üçün query-dən istifadə etməlidir, qətiyyən ikisini birlikdə etməməlidir.

İlk baxışdan CQSCQRS çox bənzəsələr də qətiyyən onları eyniləşdirmək olmaz. CQS daha çox method və ya class level-da istifadə olunur, CQRS isə CQS-ə əsaslanaraq application level-da tətbiq olunur.  CQRS command query-lər müxtəlif datastoremodel-lərə (data və ya ORM) icazə verir və məlumatlar datastore-lar arasında service bus vasitəsi ilə əlaqələndirilir. CQS- də eyni məntiqi izləyir, amma eyni datastore-lar və eyni model-ləri paylaşaraq. Bu isə CQRS-in daha mürəkkəb və böyük proyektlərdə istifadə olunmasına şərait yaradır.

Böyük proyektlərdə CQRS istifadə etmək, performance, scalabilitysecurity kimi bəzi prinsipləri üst səviyyədə əldə etməyə kömək edir. Bu yanaşmada qeyd etdiyimiz kimi metodlar 2 əsasda ayrılır:

  • Command – hər hansı bir məlumatı dəyişdirmək üçün istifadə edilir. (İnsert, Update, Delete)
  • Query – məlumatı sadəcə əldə etmək üçün istifadə edilir, dəyişdirmir. (Select)

CQRS tətbiq etməyin ən geniş yayılmış üsullarından biri command pattern-dır. Runtime-da base class əmri (command) qəbul edir, müvafiq object handler yaradılır və əmri icra edəcək metod çağrılır.

cqrs-pattern

Query DispatcherCommand Dispatcher verilən command/query-lərə uyğun handler seçmək və onu icra etmək üçün istifadə edilir. Query handler repository-dən məlumatları alır və nəticəni müvafiq DTO (Data Transfer Object) obyekti ilə əlaqələndirir. Dispatcher məlumatların UI (User İnterface) -yə qaytarılmasına cavabdehdir. Command handler sistemdə hər hansı dəyişiklik etməzdən əvvəl məlumatları doğrulamağa çalışır. Kod nümunəsi üçün bu linkə baxa bilərsiniz.

CQRS nə zaman istifadə edilə bilər:

  • Mürəkkəb və ya tələblərin tez-tez dəyişdiyi proyektlərdə istifadə edilə bilər.

  • Yüksək məlumat trafiki olan sistemlərdə istifadə edilə bilər.

Kiçik və sadəcə CRUD (Create,Read,Write,Delete) əməliyyatlarının icra olunduğu sistemlərdə isə kod oxunaqlılığını lazımsız yerə çətinləşdirməmək üçün isə istifadəsi məsləhət deyil.

CQRS-in üstünlükləri:

  • Read (oxuma) və Write (yazma) əməliyyatlarının ayrılması performance, scalabilitysecurity-ni yaxşılaşdırmağa kömək edir.

  • Read (oxuma) və Write (yazma) əməliyyatlarınız üçün müxtəlif verilənlər bazalarından istifadə edə bilərsiniz (Məsələn, yazma əməliyyatları üçün MySQL-dən, oxumaq əməliyyatları üçün Couchbase-dən istifadə edə bilərsiniz).

  • Read (oxuma) və Write (yazma) əməliyyatları bir-birindən ayrıldığı üçün hər hansı read əməliyyatında write əməliyyatını gözləmək lazım deyil.


Məqalənin müəllifi: F. Əhədli