CQRS — Command Query Responsibility Segregation

Daha iyi hizmet sağlayabilmek için okuma ve yazma görevlerini ayrıştırın

Adem Catamak
2 min readJan 24, 2020

You can access the English version via this link.

CQRS Nedir?

CQRS, okuma ve yazma/güncelleme işlemlerinin farklı modeller üzerinden yürütülmesi esasına dayanan bir yazılım geliştirme desenidir. Bir adım ileriye götürerek, okuduğunuz veriler ile yazdığınız verilerin farklı veri saklama araçlarında saklandığını da düşünebilirsiniz.

Bu yöntem ile elde edilen birkaç kazanım vardır:

  • Okuma ve yazma işlemlerinin yoğunluğuna göre sisteminizi ayrı ayrı ölçekleyebilirsiniz.
  • Okuma ve yazma işlemleriniz için farklı veri saklama araçları kullanabilirsiniz (Örneğin yazma işlemleri için PostgreSql kullanırken okuma işlemleri için Elastic Search kullanabilirsiniz).
  • İstemcilerinize, sisteminize okuma ve yazma emri verdikleri sırada anlamlı yapılar (request contract) sunabilirsiniz.
  • Okuma ve yazma işlemlerini ayırdığınız için, okuma işlemlerini yazma işlemleri sebebiyle bekletmek zorunda kalmazsınız.

CQRS Nasıl Çalışır?

Öncelikli olarak eventual consistency terimi üzerinde durabiliriz. Consistency; tutarlılık olarak çevrilebilir. Consistent sistemlerde yer alan tüm modeller kesintisiz olarak tutarlı bir şekilde saklanmaktadır. Eventual consistent sistemlerde ise yazma/güncelleme işlemleri sonucu modeller bir süre boyunca tutarsız olabilmektedir. Bu durum önünde sonunda giderilir ve sistem nihayetinde tutarlı olur.

CQRS yazılım deseni kullanılarak geliştirilen sistemlerde istemciden gelen yazma/güncelleme talepleri yazma modeliyle sistem üzerinde var olan servislere iletilir. Servisler yazma modeli (verinin gerçek hali) üzerinden varlığın durumunu kontrol eder ve gelen talebin işlenip işlenmeyeceğine karar verir. Eğer istek işlenirse, okuma modeli üzerinde de gerekli değişiklikler yapılır. Kullanıcının veri sorguladığı durumda ise, servisler talepleri okuma modeli ile yanıtlar.

CQRS, yazma modeline ait bir veriyi kabul ettiği zaman okuma modelini farklı yaklaşımlarla güncelleyebilir. Bu yöntemlerden biri yazma modelinin kaydedilmesi ile birlikte okuma modelinin aynı anda değiştirilmesidir. Unit of Work tasarımı bu noktada bize yardımcı olmaktadır.

Transactional CQRS

Bir diğer yöntem ise yazma modelinin kaydedilmesinin ardından asenkron süreçlerle okuma modelinin güncellenmesidir. Yukarıda bahsi geçen eventual consistency terimini açıklamamızın sebebi bu yöntemdir. CQRS ile oluşturulmuş sistemlerde sıklıkla tercih edilen yöntem ikincisidir. Bu sebeple genellikle, CQRS tasarımı ile geliştirilmiş sistemler eventual consistent sistemlerdir.

Eventual Consisten CQRS

Eventual consistent sistemlerde transactional bağımlılık olmadığı için okuma ve yazma eylemleri birbirlerini beklemezler. Bu sebeple de CQRS sistemler performansın önemli olduğu yerlerde kullanılmaktadır.

CQRS ile yazılım geliştirme maliyetli bir yöntemdir. Buna karşın doğru yerde kullanılması halinde, geliştirilen sistemin bakımının yapılması ve sürdürülmesi ise daha kolay olacaktır. Bu sebeple her yazılım geliştirme deseninde olduğu gibi gerektiği yerde kullanılması gerekmektedir.

CQRS ile ilgili örnek bir uygulamaya bir diğer yazım üzerinden erişebilirsiniz.

--

--