green grass near the gray road

CQRS (Command Query Responsibility Segregation) ve Event Sourcing Nedir?

Command
Bir değişime neden olmalıdır.
Herhangi bir değer dönmemelidir.

Query
Bir değişime neden olmamalıdır.
Yalnızca mevcut durumu sorgulayabilmelidir.
Sorgulamaya istinaden bir değer dönmelidir.

Insert gibi bir durumda eğer Primary Key bir veri varsa ve bu veri veritabanı katmanında oluşturuluyorsa (ÖRN: Int auto increment) istisna olarak Command’e dönüş değeri olarak atanabilir.

CQRS Uygulamaları
Single-database CQRS (used same DB)

Veritabanına okuma ve yazma için aynı veritabanı kullanılır. Bu da Command ve Query’lerin aynı hedefe gönderildiğini ifade etmektedir. Bu tarz non-clustered mimarilerde genellikle yazma işlemi sonrasında ORM ya da Unit of Work tarafından cache clean eventları fırlatılır.

CQRS mimarisine aşamalı geçişte çoğunlukla tercih edilen uygulama tipidir.

Two-database CQRS (used different DB)
Veritibanı yazma ve okuma için farklı veritabanları kullanılır. Bu da Command’lerin write DB’ye, Query’lerin read DB’ye gönderildiğini ifade etmektedir. Uygulanabilmesi için basit bir Master-Slave(s) yapısının olması yeterlidir. Yazma işlemleri Master node’a gönderilir ve slave nodelar ile otomatik senkronizasyon sağlanır. Okuma işlemlerinde slave nodelar kullanılır. Bu uygulamanın tek negatif yanı olası sync problemi yaşanması halinde kullanıcılara eski veriler sunulmasıdır.

Event Sourcing CQRS (used same/different DB)
Bu uygulamada aynı ya da farklı DB’ler kullanılabilir, odak noktası etkinliklerin saklanmasıdır. Genel kullanımda elimizde verinin son halini row base, document base vs. tutarız. Ama bu verinin T anındaki durumu hakkında bilgimiz olamaz yalnızca son halini bilebiliriz. Verinin geçmiş bir andaki durumu hakkında bilgimizin olabilmesi için change log vb. yöntemler uygulamamız gerekir. Event Sourcing ile etkinlikleri kaydederiz ve bir verinin son haline ulaşmak için tüm kayıtları birleştirmemiz gerekir. Ama işin güzel kısmı verinin dilediğimiz bir andaki durumuna ulaşabiliriz. Bu da artık geri/ileri sarma yeteneğimiz olduğu anlamına gelir. Command’ler insert eylemine işaret etmelidir, geri sarmak gerekiyorsa +10 olan bir kayıt için -10 şeklinde kayıt atılmalıdır. (Bu işleme düzeltme kaydı denilir.) Query’ler ise istediğimiz an için kayıtları birleştirerek veriler sunar.

Event Sourcing hakkında ayrıntılı bilgi için: martinfowler.com/eaaDev/EventSourcing.html

CQRS bize daha verimli, anlaşılabilir ve geliştirilebilir sistemler tasarlamamız, performansı optimize edebilmemiz noktasında faydalar sağlar.