CQRS Nedir?
İngilizce: CQRS (Command Query Responsibility Segregation)
CQRS, komut ve sorgu sorumluluklarını ayırarak yazma modeliyle okuma modelini farklı ihtiyaçlara göre tasarlayan mimari desendir.
CQRS Nedir?
CQRS (Command Query Responsibility Segregation), veri değiştiren işlemlerle veri okuyan işlemleri ayrı modellerde ele alan mimari desendir. Sipariş oluşturma, stok düşme veya ödeme alma birer command iken; sipariş detayını, raporu veya liste ekranını göstermek query tarafına girer.
Nasıl Çalışır?
Geleneksel CRUD modelinde aynı veri modeli hem okuma hem yazma için kullanılır. CQRS’de yazma modeli iş kurallarını ve tutarlılığı korumaya odaklanır; okuma modeli ise ekranların ihtiyaç duyduğu hızlı ve sade görünümleri üretir. Okuma tarafı çoğu zaman denormalize edilir, cache veya ayrı veritabanı kullanabilir.
Event Sourcing ve DDD ile İlişkisi
CQRS tek başına event sourcing gerektirmez, fakat ikisi birlikte sık görülür. Event sourcing yazma tarafındaki değişiklikleri olay olarak saklar; bu olaylardan okuma modelleri yeniden üretilebilir. DDD projelerinde karmaşık domain kuralları command tarafında daha net modellenebilir.
Ne Zaman Kullanılır?
- Okuma trafiği yazma trafiğinden çok daha fazlaysa
- Raporlama veya arama ekranları transactional modelden farklı veri yapısı istiyorsa
- İş kuralları karmaşık ve domain modelinin korunması gerekiyorsa
- Farklı ekipler okuma ve yazma tarafını bağımsız ölçeklemek istiyorsa
Dikkat Edilecekler
CQRS basit CRUD uygulamaları için gereksiz karmaşıklık yaratabilir. Okuma modelinin yazma modelinden gecikmeli güncellenmesi eventual consistency doğurur; kullanıcıya gösterilecek durum, yeniden deneme ve hata telafisi açık tasarlanmalıdır.
İlgili Terimler
DDD, karmaşık iş alanlarını domain modeli, bounded context ve ortak dil etrafında yazılım mimarisine taşıyan tasarım yaklaşımıdır.
Event SourcingEvent sourcing, uygulama durumunu son değer olarak değil, değişiklikleri anlatan sıralı ve değişmez olay kayıtları olarak saklayan mimari desendir.
Saga DeseniSaga deseni, dağıtık servislerde uzun işlemi adımlara bölüp hata olduğunda telafi aksiyonlarıyla tutarlılığı koruyan mikroservis yaklaşımıdır.