CQRS Tasarım Deseni

Nihat Kerem Bora
3 min readJan 12, 2025

--

Bu yazıda, yazılım dünyasında sıkça kullanılan ve önemli bir yere sahip olan CQRS Tasarım Desenini ele alacağız. Tasarım desenlerini anlamak ve projelerimize uygulamak, daha etkin ve verimli bir yapı oluşturmanın anahtarıdır. Şimdi CQRS’in temel ilkelerine ve C# ile nasıl uygulanabileceğine birlikte göz atalım.

CQRS Tasarım Deseni Nedir?

CQRS (Command and Query Responsibility Segregation), veritabanı üzerindeki okuma ve yazma işlemlerini birbirinden ayırmayı temel alan bir tasarım desenidir. Bu desen, özellikle karmaşık sorguların ve verimsiz veritabanı işlemlerinin önüne geçmek için kullanılır. CQRS, komut (command) ve sorgu (query) işlemlerini ayrı süreçler olarak ele alır.

Bu deseni daha iyi anlamak için geleneksel monolitik uygulamalara bakabiliriz. Monolitik yapılarda genelde tek bir veritabanı bulunur ve bu veritabanı hem okuma hem de yazma işlemleri için kullanılır. Ancak bu durum, veritabanının hem karmaşık sorguları hem de CRUD (Create, Read, Update, Delete) işlemlerini aynı anda yerine getirmek zorunda kalması anlamına gelir. Uygulama büyüdükçe bu yapı yönetilemez hale gelir.

Okuma İşlemleri: Eğer uygulamanız, 10’dan fazla tabloyu birleştiren karmaşık bir sorguya ihtiyaç duyuyorsa, bu işlem sorgunun gecikmesine ve veritabanı kilitlenmesine yol açabilir.

Yazma İşlemleri: İş kurallarını uygulamak ve çok sayıda doğrulama gerçekleştirmek gereken yazma işlemleri, veritabanında aşırı yüklenmeye sebep olabilir.

Bu tür sorunların üstesinden gelmek için CQRS, veritabanını iki ayrı role ayırır:

1. Okuma (Query): Karmaşık sorgular için optimize edilmiş okuma veritabanı.

2. Yazma (Command): CRUD işlemleri ve iş mantıkları için optimize edilmiş yazma veritabanı.

Bu ayrım sayesinde performans artışı sağlanır ve yönetilebilirlik kolaylaşır. Ayrıca, okuma ve yazma veritabanları arasında nihai tutarlılıkilkesi uygulanarak senkronizasyon sağlanabilir. Bu, mikroservis tabanlı uygulamalarda esnekliği artırır.

C# ile CQRS Nasıl Uygulanır?

C# ile CQRS uygulamak için temel prensip, okuma ve yazma işlemlerini farklı katmanlarda veya bileşenlerde ayırmaktır. İşte adım adım nasıl uygulanabileceğine dair rehber:

1. Commands (Komutlar)

• Komutlar, yazma işlemlerini yönetir. Örneğin:

• “Alışveriş sepetine ürün ekle”

• “Siparişi tamamla”

• Komutlar genellikle görev odaklıdır ve asenkron olarak çalıştırılır.

• Komut işleme için message broker sistemleri (örneğin RabbitMQ, Kafka) kullanılabilir.

2. Queries (Sorgular)

• Sorgular, yalnızca okuma işlemleri gerçekleştirir ve veritabanını değiştirmez.

• Çıktı genellikle DTO (Data Transfer Object) nesneleri olarak döner.

• Sorgular, kullanıcı arayüzü (UI) ihtiyaçlarına uygun, optimize edilmiş veri sağlar.

3. Okuma ve Yazma Veritabanlarının Ayrılması

CQRS prensibi gereği, okuma ve yazma veritabanları fiziksel olarak ayrılmalıdır. Bu, performansı artırır ve işlemler arasındaki izolasyonu sağlar. Örneğin:

Okuma Veritabanı: NoSQL (MongoDB, Elasticsearch gibi)

Yazma Veritabanı: İlişkisel Veritabanı (SQL Server, PostgreSQL gibi)

4. Materialized View Kullanımı

Materialized View Pattern, okuma işlemlerini optimize etmek için önceden tanımlanmış veri görünümleri oluşturur. Karmaşık sorgular ve join işlemleri bu sayede ortadan kalkar.

• C# ile materialized view mantığını uygulamak için veri şemalarını önceden optimize edebilir veya özel bir sorgu hizmeti yazabilirsiniz.

CQRS’in Avantajları

Performans Artışı: Okuma ve yazma işlemleri birbirinden bağımsız çalıştığı için, yoğun trafikte veritabanı kilitlenmelerini önler.

Esneklik: Farklı veritabanı türleri kullanılabilir. Örneğin, okuma için NoSQL, yazma için ilişkisel veritabanı.

İzolasyon: Komutlar ve sorgular birbirinden tamamen bağımsızdır. Bu, kodun yönetimini ve bakımını kolaylaştırır.

Mikroservis Uyumlu: CQRS, mikroservis mimarisinde ölçeklenebilirlik ve bağımsız geliştirme açısından idealdir.

Sonuç

CQRS tasarım deseni, özellikle karmaşık sorguların ve yoğun yazma işlemlerinin olduğu sistemlerde önemli avantajlar sağlar. Komut ve sorgu işlemlerini ayırarak uygulama mimarisini daha verimli, esnek ve ölçeklenebilir bir hale getirebilirsiniz. C# ile CQRS uygularken, sorumlulukların ayrımını doğru şekilde yaparak modern uygulamalarınızda bu desenin gücünden faydalanabilirsiniz.

--

--

No responses yet