Sayfalar

2 Mart 2025 Pazar

Mikroservislerde CQRS’in Faydaları

CQRS (Command Query Responsibility Segregation), mikroservislerde yazma (command) ve okuma (query) işlemlerini ayırarak büyük ölçekli ve karmaşık sistemlerde veri tutarlılığı, performans ve esneklik sağlar. CQRS’in mikroservislere nasıl fayda sağladığını anlamak için öncelikle bu deseni detaylı olarak ele alalım, ardından mikroservisler bağlamında nasıl çalıştığına dair bir örnek üzerinden açıklayalım.

CQRS Nedir?

CQRS, "Komut" (Command) ve "Sorgu" (Query) işlemlerini birbirinden ayıran bir yazılım tasarım desenidir.

  • Command (Komut): Veri değişiklikleri veya işlemlerini temsil eder (örneğin, veri ekleme, güncelleme, silme). Komutlar sistemde bir etki yaratır.
  • Query (Sorgu): Veri okuma işlemlerini temsil eder. Sorgular verileri okur ve geri döndürür, sistemde herhangi bir etki yapmaz.

CQRS, bu iki tür işlemi ayırarak her birinin ayrı bir işlevsellik ve veri modeline sahip olmasını sağlar.

Mikroservislerde CQRS’in Faydaları

1. Veri Modeli Ayrımı ve Optimizasyonu:

  • Yazma ve Okuma Modelleri Ayrılır: Yazma (command) işlemleri ve okuma (query) işlemleri için farklı veri modelleri kullanılabilir. Yazma işlemleri, genellikle veri tutarlılığını ve işlem bütünlüğünü sağlamak için daha karmaşık ve normalize edilmiş bir model gerektirirken, okuma işlemleri için denormalize edilmiş modeller kullanılabilir. Bu, okuma işlemlerinin hızını artırırken, yazma işlemlerinin daha tutarlı ve güvenli olmasını sağlar.
  • Örnek: Bir e-ticaret uygulamasında, "sipariş" veri modeli, yazma için detaylıdır (müşteri bilgileri, ödeme bilgileri, ürünler, indirimler, vb.), ancak okuma için sadece müşteri adı, sipariş durumu ve toplam fiyat gibi daha basit alanlar yeterlidir. CQRS ile bu iki model ayrı tutulur, böylece okuma işlemleri daha hızlı yapılabilir.

2. Performans İyileştirmesi:

  • Sorgu Performansı: Okuma işlemleri için denormalize edilmiş veri yapıları kullanılabilir. Bu, sorguların daha hızlı ve daha verimli çalışmasını sağlar çünkü her okuma işlemi için tüm veri seti yerine sadece gerekli olan veri sorgulanır.
  • Örnek: Bir "sipariş" tablosunda müşteri bilgileri ve sipariş kalemleri normalde aynı tabloda depolanabilir. Ancak, yalnızca siparişlerin durumu gerektiğinde sorgulanacaksa, okuma işlemi için yalnızca sipariş durumu ve müşteri bilgileri yer alan denormalize edilmiş bir model kullanılır.

3. Ölçeklenebilirlik:

  • Yazma ve Okuma İhtiyaçları Ayrı Ayrı Ölçeklendirilebilir: Yazma ve okuma işlemleri farklı hızda büyüyebilir. CQRS ile okuma ve yazma işlemleri için farklı sunucular veya hizmetler kullanılabilir. Bu, her iki işlemi de farklı derecelerde ölçeklendirme imkanı sağlar.
  • Örnek: Bir sosyal medya platformunda, kullanıcılar sıkça içerik oluştururken, içerikler üzerinde yapılan sorgular (beğeni sayısı, yorumlar vb.) çok daha fazla olabilir. Okuma işlemleri yoğunluğu arttıkça, okuma hizmetleri ölçeklendirilebilirken, yazma işlemleri sabit kalabilir.

4. Dağıtık İşlem ve Transaction Yönetimi:

  • SAGA Pattern ile Entegrasyon: CQRS, SAGA gibi dağıtık transaction yönetim desenleriyle uyumludur. Bu, mikroservisler arasında işlem yönetimini kolaylaştırır. SAGA, bir işlemde birden fazla adımı yöneten bir desendir ve her adım bir mikroservis tarafından işlenir.
  • Örnek: Bir online ödeme sisteminde, ödeme işlemi birkaç mikroservisin katılımını gerektirir (sipariş oluşturma, ödeme onayı, kullanıcı hesap güncellemesi vb.). CQRS ile bu yazma işlemleri ayrı tutulabilir, ve bir hata durumunda işlem geri alınabilir (rollback) veya telafi edilebilir.

5. Veri Tutarlılığı ve Eventual Consistency:

  • Eventual Consistency Sağlanır: CQRS genellikle Event Sourcing ile birlikte kullanılır. Event Sourcing, veri değişikliklerini olaylar olarak kaydeder. Bu olaylar, zaman içinde tüm mikroservislere iletilir ve veri tutarlılığı sağlanır. Bu, özellikle dağıtık sistemlerde önemli bir avantaj sağlar.
  • Örnek: Bir ödeme yapıldığında, bu işlem bir "Ödeme Başarılı" olayı olarak kaydedilir. Bu olay, ödeme ile ilgili diğer mikroservislere iletilir (sipariş servisi, kullanıcı servisi, vb.) ve her servis kendi veri modelini günceller. Bu süreç sonunda veri tutarlılığı sağlanmış olur.

CQRS’in Mikroservislere Sağladığı Faydaları Detaylı Bir Örnekle Açıklama

Diyelim ki bir e-ticaret uygulaması geliştiriyorsunuz ve aşağıdaki mikroservislerden oluşan bir yapıya sahipsiniz:

  1. Sipariş Servisi: Sipariş verilerini yönetir.
  2. Kullanıcı Servisi: Kullanıcı bilgilerini yönetir.
  3. Ürün Servisi: Ürün bilgilerini yönetir.
  4. Ödeme Servisi: Ödeme işlemlerini yönetir.

Komut (Command) İşlemleri:

Bir müşteri ürünleri sepete ekleyip ödeme yapmak istediğinde, bir sipariş komutu oluşturulur. Bu komut, yazma işlemi olarak Sipariş Servisi tarafından işlenir. Sipariş oluşturma, ödeme işlemi yapma ve kullanıcı bilgilerini güncelleme gibi tüm işlemler tutarlı bir şekilde tek bir işlemde yapılır.

  • Ödeme Başarılı olursa, bu işlem Sipariş Servisi, Kullanıcı Servisi ve Ürün Servisi tarafından güncellenir.
  • Event Sourcing kullanıyorsanız, bu ödeme olayı bir “Ödeme Başarılı” olayı olarak kaydedilir ve diğer servisler bu olayı dinler.

Sorgu (Query) İşlemleri:

Kullanıcılar, siparişlerini görmek istediklerinde, okuma (query) işlemi yapılır. Okuma işlemi Sipariş Servisi üzerinde gerçekleştirilir, ancak denormalize edilmiş veri modeli kullanılır. Yalnızca kullanıcı adına, sipariş durumuna ve ürün fiyatlarına dair veriler sorgulanır, tüm detaylar yerine özet veriler alınır.

Bu sayede okuma işlemi çok daha hızlı ve verimli olur.

CQRS’in Mikroservislere Sağladığı Faydalar:

  • Ölçeklenebilirlik: Sipariş işlemleri ve okuma işlemleri bağımsız olduğundan, okuma işleminde artan yoğunluğu karşılamak için okuma servislerini daha fazla ölçeklendirebilirken, yazma işlemleri sabit kalır.
  • Veri Tutarlılığı: Event Sourcing sayesinde, her mikroservisin güncel verilere erişmesini sağlarsınız. Hatalı bir işlem olursa, SAGA Pattern ile işlemi geri alabilirsiniz.
  • Performans: Okuma ve yazma işlemlerinin ayrılması sayesinde, her iki işlem de optimize edilebilir. Okuma işlemleri için denormalize edilmiş, daha hızlı sorgular kullanılır.

Sonuç:

CQRS, mikroservis mimarisinde işlem yönetimini, veri tutarlılığını ve performansı iyileştiren güçlü bir yaklaşımdır. Yazma ve okuma işlemlerini ayırarak, her iki işlem için de daha verimli, ölçeklenebilir ve tutarlı bir yapı sağlanır. Event Sourcing ve SAGA gibi desenlerle entegrasyonu, dağıtık sistemlerde veri tutarlılığı ve işlem yönetimini kolaylaştırır. Bu, mikroservislerin başarısını artırır ve sistemin daha esnek ve yönetilebilir olmasına olanak tanır.

Hiç yorum yok:

Yorum Gönder