Oğuzhan Eren

my blog bounded context


CQRS Nedir?

Thursday, September 11, 2014

CQRS CQS prensibinden türemiştir. Bu nedenle önce CQS'i açıklayalım.

Command Query Separation

Bu prensibe göre bir nesnenin metodları Command ve Query olarak ikiye ayrılmalıdır. Bir metod bir nesne üzerinde değişiklik yaparak geriye sonuç döndürmemelidir.

  • Command : Nesnenin durumunu değiştirir fakat geriye sonuç dönmez.
  • Query: Sonuç döndürür fakat nesnenin durumunu değiştirmez.

Bu prensib metodların ne yaptığını, ne yapmadığını ve neyi değiştirdiğini anlamak için fayda sağlar.

CQRS

CQRS "Command-query responsibility segregation" anlamına gelir. Command(yazma) ve Query(okuma) olarak davranışların ayrılmasıdır. Command ve Query farklı iki nesne tarafından ele alınırlar.

Genelde servis tanımları aşağıdaki gibidir:

ProductService
    void AddProduct(productId,name)
    Product GetProduct(productId)
    void DisableProduct(productId)
    Product[] GetAllProducts(categoryId)

Yukarıdaki servise CQRS uygulandığında sonuçta okuma ve yazma olarak iki servis elde ederiz:

ProductCommandService
    void AddProduct(productId,name)
    void DisableProduct(productId

ProductReadService
    void AddProduct(productId,name)
    Product[] GetAllProducts(categoryId)

Bu yaklaşımı daha ileriye taşıyarak Command ve Query için kullanılacak veritabanlarınıda ayırabiliriz. Bu işlem yapıldığında, okuma işlemleri için optimize edilmiş birden fazla verimodeli ve veritabanı kullanılabilir. Okuma ve yazma veritabanlarını ayırmak CQRS ile ilişkilidir ve CQRS'in kendisi değildir, CQRS sadece okuma ve yazma işlemlerini ayırmaktır.

CQRS ilgili önemli ve ilginç olan nokta ne zaman, nerde ve nasıl kullanılacağıdır. Bu yaklaşımı kullanmak, ölçeklenebilirlik, karmaşıklığı ve değişen iş kurallarını yönetebilmek gibi mimari sorunları daha geniş bir yelpazede çözmek için olanak sağlar. CQRS bir mimari şablon değildir, tüm sistem düzeyinde uygulanmak yerine birden çok katılımıcının olduğu domainlerde (collaborative domain) ve ölçeklenebilirliğin önemli olduğu Bounded Context'lerde uygulanmalıdır.

Bir sonraki yazımda CQRS'in ne için uygulanması gerektiği ve hangi sorunları çözdüğünden bahsediyor olacağım.


cqrs ddd