Merhaba,

Bugün CQRS ‘den bahsedeceğim. Yeni projemizle beraber özellikle Clean Architecture, async ve bunlarla beraber CQRS üzerine yoğunlaşmışken, konuyla ilgili öğrendiklerimi yazıya dökmek istedim.

Bir junior olarak öğreneceğim her yeni kavramda sorduğum ilk soru: “Neden X’e ihtiyacımız var ?” oluyor. “Öncesinde ne kullanılıyordu, X’in eksik kaldığı noktalar nelerdi, projemize neler katacak ya da neleri değiştirecek ?” sorularına cevap bulmadan (bazen kafama yatması uzun sürse bile :))ilerlemiyorum çünkü neyi neden kullanacağımı bilmeden kodlamayı sağlıklı bulmuyorum. Dolayısıyla, CQRS için de, önce bu sorulara cevap vereceğim, daha sonra konuyu detaylandıracağım.

CQRS’ e neden ihtiyacımız olduğuyla başlayalım : uygulama ne kadar kompleks olursa geleneksel yazılım mimarileri & modelleri, sürekli gelişmekte ve değişmekte olan piyasa ihtiyaçlarını karşılamak konusunda o kadar eksik kalıyor ya da karşılarken zaman,maliyet, scalability (ölçeklenebilirlik),traceability (izlenebilirlik) gibi birçok önemli özellikten ödün verilmesine neden oluyor. Bu dinamik pazarda rekabet edebilmek için de uygulamaların geleneksel yöntemlere alternatif daha esnek, daha bağımsız ; zaman, maliyet, dependency gibi metrikleri dikkate alan daha yeni yapılar kullanması (zaman zaman geçiş yapması) gerekebiliyor. CQRS (Command and Query Responsibility Segregation), adının birebir karşılığı olarak, command ve query’leri ayırmamız gerektiğini söylüyor. Daha açık olmak gerekirse, aynı data modeli üzerinde hem query hem CRUD operasyonları yapılması yerine datanın okunduğu ve yazıldığı modelleri birbirinden ayırıyor. Read işlemleri için ayrı write işlemleri için ayrı data modellerinin kullanılması prensibini benimsiyor.

Peki bu yapıyı kullanmazsak uygulamamız neler kaybeder ? Öncelikle CQRS’in hangi senaryolarda avantaj sağladığına değinelim :

Yukarıdaki durumlarda zaman zaman data modelleri yetersiz kalabilir. Ancak, CQRS sayesinde domain ve infrastructure katmanları karıştırılmadan yönetilebilir.

Microsoft bu durumlardan bazılarını ve sonuçlarını şu şekilde açıklamış :

https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs

İşte CQRS pattern bu durumlara bir çözümdür. Evet bir patterndir ; command ve query sorumluluklarını genelleştirilmiş ve sistematik bir yapı ile read & write data modelleri üzerine yükler ve ayrı ayrı yürütür.

CQRS kullanımının uygun olmadığı bazı case’ler ise aşağıda verilmiştir :

Sonuç olarak CQRS command ve query sorumluluklarını birbirinden ayıran, kompleks projelerde, sürekli değişen business logic’lerinde kullanılan bir patterndir. Uygulamanın performansını, ölçeklenebilirliğini ve güvenliğini arttırır.

Mathematical Engineer & Software Developer | www.linkedin.com/in/beyza-celep

Mathematical Engineer & Software Developer | www.linkedin.com/in/beyza-celep