İçeriğe geç →

CQRS (Command Query Responsibility Segregation) Nedir?

Bu makalemde kimine göre basit bir pattern kimine görede architectural bir yaklaşım olan
CQRS yani Command Query Responsibility Segregation konusunun (Komut ve Sorgu Sorumluluklarının Ayrışması)
üzerinde duruyor olacağız.

cqrs

Son zamanlarda gözlemlediğim kadarıyla yabancı bloglar da ve stackoverflow üzerindeki tartışmalarda CQRS’in yavaş yavaş popülerliğini kazanmakta ve hala anlaşılması üzerinde soru işaretleri olan bir pattern türü olduğunu düşünüyorum. Bende araştırmalarıma farklı kaynaklardan yola çıkarak (makalemin sonunda paylaşacağım sizlerle) hem benim kavrayabilmem hemde kavraya bildiklerimi sizlerle paylaşabilmem amaçlı bu makaleyi yazmaya karar verdim. 🙂

Haydi bir bakalım neymiş bu CQRS?

CQRS pattern’i Greg Young ve Udi Dahan tarafından tanıtılmış ve onlar bu fikri Command Query Separation isimli Bertrand Meyer‘in “Object Oriented Software Construction” isimli kitabından esinlenerek almışlardır.

CQS altındaki ana fikir:

Bir metot objenin durumunu değiştirmelidir yada geriye bir sonuç dönmelidir fakat her ikisini birden değil. Biraz karışık gelmiş olabilir. Şimdi birde Wikipedia değimiyle bakmak gerekirse, Eğer geriye dönecek değerler referentially transparent (birazdan değineceğim) ise ve hiçbir yan etkiye sahip değilse (referentially transparent fonksiyonun yan etkisi yoktur) metotlar geriye bu değerleri dönmelidir.

Referentially Transparent: 

Herhangi bir fonksiyonun çıktısının sadece girdisine bağlı olması durumudur diyebiliriz ve yukarıda belirttiğim gibi yan etkisi yoktur ve aynı parametreler verildiğinde daima aynı sonucu üretir.

CQS’e göre metotlar iki parçaya ayrılmalıdır:

  • Commands: Objenin veya sistemin durumunu değiştirir.
  • Queries: Sadece sonucu geriye döner herhangi bir objenin veya sistemin durumunu değiştirmez.

Bakıldığında CQS bize metotların ne yapıp ne yapmadığını anlamamızı sağlıyor. Bu durumda eğer bir dönüş değeri varsa nesnenin durumunu değiştiremez. Eğer nesnenin durumunu değiştiriyorsa, dönüş değeri void olmalıdır. Böylelikle nesneleri daha kolay ele alabilmemizi sağlıyor.

CQRS ise CQS‘in bir uzantısı olarak kabul edilir.CQRS‘in tanımı CQS ile aynıdır fakat ikisi tamamen ayrı patternlerdir. Aralarındaki temel farklılık ise CQRS içinde nesneler, Commands ve Queries olmak üzere iki farklı nesne olarak ele alınırlar.

Basit bir servis tanımlayalım CQRS’i daha iyi ele alabilmek için:

Şimdi CustomerService‘e CQRS uygulandığında bize Commands ve Queries işlemlerini yapacak iki farklı nesne verecektir.

Görünürde çok basit bir işlem olsa da mevcut olan sistem üzerinde birçok problemin çözülmesini sağlamaktadır. Bu servis içinde Read tarafı ve Write tarafı yani Command ve Query tarafı olarak iki farklı servise bölünmüştür.

Bu ayrım Command tarafının ve Query tarafının farklı ihtiyaçlara sahip olduğu düşüncesindedir.

Ne zaman CQRS kullanılmalı?

  • Geniş ve bir çok katılımcının olduğu verilerde(collaborative data veya collaborative domain), çok kullanıcılı sistemlerde, kompleks ve her zaman değişen iş kurallarının olduğu durumlarda kullanılabilir.
  • CQRS ile read ve write işlemleri üzerinde harika performanslar elde edilebilir, bu işlemler optimize edilerek istenirse farklı veritabanlarına da bölünebilir.
  • CQRS altyapısal işlemlerde bizi karmaşık domain logic işlemlerinden kurtulmamızı sağlar.
  • CQRS geliştirme aşamalarını da farklı takımlara bölebilmemizi sağlar ve böylelikle her takım domain logic üzerinde çalışabilir hale gelir.

Avantajlarına baktığımızda göze hoş geliyor fakat haydi CQRS kullanalım deyipte kullanılacak türden değil. Kullanılacağı zaman zaten proje kendisi söyleyecektir yukarıdaki maddelerden yola çıkarak ölçeklenebilirliği(scalability) azaldığında ve domain logic git gide kompleks bir hal almaya başladığında gerekecektir.

CQRS ile birlikte kullanılan event sourcing ve consistency üzerine araştırmalarıma devam edeceğim ve elde ettiğim yeni bilgileri bir sonraki makalemde paylaşıyor olacağım.

Şimdilik sağlıcakla. 🙂

Kaynaklar:

https://cqrs.wordpress.com/documents/cqrs-introduction/
http://www.codeproject.com/Articles/555855/Introduction-to-CQRS
http://martinfowler.com/bliki/CQRS.html
https://en.wikipedia.org/wiki/Command%E2%80%93query_separation
 

Bu makale toplam (2917) kez okunmuştur.

19
1



Kategori: Architectural

Tek Yorum

  1. Ömer Ömer

    Teşekkürler. Güzel yazı hocam.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*