Komut sorgusu sorumluluk ayrımı (CQRS), verileri almayı ve verileri değiştirmeyi farklı şekilde ele alan bir programlama tasarım modelidir. CQRS, sorgu sürecini basitleştirmek ve karmaşık, çok sistemli değişiklikleri gizlemek için komut işleyicileri kullanır.
Tasarım deseni, Bertrand Meyer tarafından, verilerle çalışan bir yöntemin yalnızca iki görevden birini gerçekleştirmesine izin verilmesini sağlamanın bir yolu olarak geliştirilmiştir. Bir yöntem ya bilgiyi alabilir ya da değiştirebilir, ancak ikisini birden yapamaz. Nesne yönelimli terimlerle, bu paradigma, sorumlulukları iki farklı sınıfa ayırır – biri okuma ve diğeri silme, oluşturma ve güncelleme için.
CQRS, olay kaynağıyla birleştirildiğinde, işlem tutarlılığını koruyan veritabanındaki değişikliklerin denetim günlüğünü garanti eder.
CQRS Modeli Nasıl Uygulanır
CQRS’yi uygulamanın en yaygın yolu, üst düzey bir arabirim tanımlayan yazılım sistemi olan komut kalıbıdır. Çalışma zamanında, temel sınıf komutu alır, uygun nesne işleyicisini oluşturur (belki güncelleme, silme veya oluşturma) ve komutu yürütmek için bir yöntem çağırır.
Yürütmeden önce ve sonra, temel sınıf yöntemin çağrıldığını kaydedebilir. Bu, zaman içinde herhangi bir noktadan tekrar oynatılabilen bir günlük oluşturur. Arayüz ve sevk kodu bir kez mevcut olduğunda, olayları alıp tekrar oynatacak bilgisayar programı bir for döngüsünden çok daha karmaşık değildir. Yani program belirli bir noktadan bir dosyayı okur ve ardından her satır için o satırdaki komutu o satırdaki verilerle çağırır. Komut işleyicinin içinde çok fazla karmaşıklık gizlidir, ancak işleyici tarafından sınırlandırılır veya kapsüllenir.
İşleyiciler, sistemde mantıksal bir öğe oluşturmak, güncellemek veya silmek için sürecin her adımını çağırır. İlk isteği gönderebilir, ancak aynı zamanda bu eylemin ne zaman tamamlandığını, gerekirse hataları ve geri almaları ele almak için izler. Bu, işleyicinin bazen destan deseni olarak adlandırılan uzun süreli iki aşamalı bir taahhüt uyguladığı anlamına gelir. İşleyici tamamlandığında (veya işlem başarısız olduğunda ve hatalar olduğunda), işleyici sonuçları olay günlüğüne yazacaktır.
Değişiklikleri bu şekilde oluşturan ve izleyen bir sistem, sonunda her sistem değişikliğinin kaydını içeren bir olay günlüğü oluşturacaktır. Bu günlük, bir programın okuyabileceği ve yeniden yürütebileceği tutarlı bir şekilde oluşturulursa, olay kaynağını etkinleştirir.

CQRS Örnek
Bir müşterinin sipariş süreci sırasında bir CQRS örneği görülebilir. Müşteri bir siparişe baktığında süreç nispeten basittir: bir veritabanından okuma. Pratikte bu okuma, Redis gibi bir NoSQL anahtar/değer deposundan olabilir. Bu anahtar/değer çifti, müşteriyle ilgili tüm erişimi kolay bilgileri tek bir yerde saklar. Bir mikro hizmet bilgileri alır ve bir web sayfası görüntüler. Okuma tarafı basittir ve tamamen ön uç geliştiricilerle çalışan Redis ekibi tarafından yapılabilir. Böylece, CQRS’nin okunmasının sorumluluğu yazmadan ayrılmıştır.
Ancak işlemin yazma tarafı çok daha karmaşıktır ve birkaç farklı adım ve bağımlılık içerir. Örneğin, bir sipariş sevk edilmeden önce iptal edilirse, iadenin önbellekte iptal edilmesi ve ana kaynak kayıt sisteminde iade edilmesi gerekir. Veri ambarı olan şirketlerin, diğer yardımcı sistemlerin yanı sıra ambardan kaydı silmeleri gerekecektir. Ürünü göndermemek için fiziksel depo ve nakliyenin bildirilmesi gerekir. Diğer karmaşıklıklar, ters çevrilmesi gereken kredi kartı ücretlerini, depodaki stok sayımlarının değiştirilmesini ve tedarikçiden gelen yeniden doldurma siparişinin birer birer azalmasını içerebilir.
Tek bir değişikliğin pek çok yere kopyalanması gerektiğinden, işlemin güncelleme, silme ve oluşturma tarafının ya bir kurumsal hizmet veri yolu (ESB) ya da destan modeli gibi bir komut işleyici ile etkileşime girmesi gerekecektir. CQRS, bu karmaşık işlemleri işlemek için mantığı koymak için bir yer sağlar.
CQRS Zorlukları
CQRS’nin ana zorluğu aynı zamanda bir bakıma faydasıdır. Yaklaşımlar, mevcut kod tabanının üzerinde bir karmaşıklık katmanı oluşturur. Basit bir SQL yerine, artık uygulamada komut işleyicileri, gönderme ve günlüğe kaydetme olacak. Tüm bu ek kodlar, hata potansiyeli yaratır.
CQRS bir karmaşıklık sorununu çözdüğü için, halihazırda daha karmaşık hale gelen mevcut bir sisteme sahip olan kuruluşlara hitap etmektedir. Mevcut sistemin bu kadar karmaşık bir geçiş günlüğü olmayabilir veya güncellemeleri yapmak için gece toplu iş modunu kullanabilir. Halihazırda çevrimiçi çalışan böyle bir sistemin CQRS’ye dönüştürülmesi zor olabilir.
CQRS hakkında daha fazla kaynak için;
https://www.techtarget.com/searchapparchitecture/definition/CQRS-command-query-responsibility-segregation