Tabii, basit bir senaryo üzerinden CQRS deseninin nasıl çalıştığını ve yazma ile okuma veri tabanlarının nasıl ayrıldığını adım adım açıklayalım.
Senaryo: E-Ticaret Uygulaması - Sipariş İşlemleri
Diyelim ki bir e-ticaret uygulamanız var ve burada bir kullanıcı sipariş vermek istediğinde, sipariş bilgileri önce sipariş yazma veritabanına kaydedilecek. Ardından bu sipariş bilgileri sipariş okuma veritabanına aktarılacak ki kullanıcı daha sonra siparişlerinin durumunu görsün.
Adımlar:
1. Yazma (Command) İşlemi
- Kullanıcı Sipariş Veriyor:
- Kullanıcı, e-ticaret platformunda bir ürün seçip ödeme yapar. Bu işlem, bir sipariş komutu (command) oluşturur.
- Sipariş oluşturulurken, siparişle ilgili tüm detaylar (ürün adı, fiyat, miktar, teslimat adresi) yazma veri tabanına kaydedilir.
siparisler
tablosu:siparis_id kullanici_id urun_adı miktar fiyat teslimat_adresi 1 101 Ürün A 2 50 TL Adres 1
2. Event Tetikleme (Sipariş Olayı)
- Sipariş başarılı bir şekilde yazma veri tabanına kaydedildikten sonra, bu işlem bir sipariş oluşturuldu olayı (event) tetikler.
- Event (Olay): "Sipariş Oluşturuldu" olayı, yazma veritabanına kaydedilen siparişi temsil eder.
3. Okuma (Query) İşlemi ve Güncelleme
- Event Listener (Olay Dinleyicisi): Bu "Sipariş Oluşturuldu" olayı bir event listener tarafından dinlenir. Event listener, bu olayı aldıktan sonra okuma veri tabanını günceller.
- Okuma Veri Tabanı (denormalize edilmiş model):
- Okuma veri tabanı, sadece siparişin temel bilgilerini tutar (örneğin, sipariş durumu, ürün adı, fiyat, vb.).
- Okuma veri tabanındaki model, hızlı sorgulamalar için optimize edilmiştir, bu nedenle sadece sıklıkla sorgulanan bilgiler tutulur.
siparisler_okuma
tablosu:siparis_id kullanici_id urun_adı fiyat siparis_durumu 1 101 Ürün A 50 TL İşlemde
- Okuma Veri Tabanı (denormalize edilmiş model):
4. Kullanıcı Siparişini Görüntüler
- Kullanıcı, siparişinin durumunu görmek için okuma veri tabanını sorgular.
- Okuma veri tabanında, sipariş durumu gibi bilgileri hızlıca alabilir. Burada okuma veri tabanı sadece siparişle ilgili bilgilerin özetini tutar, örneğin:
- Siparişin durumu: “İşlemde”
- Ürün adı ve fiyat bilgisi
Okuma veri tabanı, sadece sıklıkla sorgulanan ve gösterilmesi gereken temel bilgileri içerdiğinden, kullanıcı sipariş bilgilerini hızlı bir şekilde alabilir.
Özet:
- Yazma Veritabanı: Siparişin tüm detayları (örneğin, ürün adı, miktar, fiyat, teslimat adresi vb.) normalize edilmiş biçimde kaydedilir. Bu veritabanı, veri tutarlılığını sağlamak için ACID özelliklerine sahiptir.
- Okuma Veritabanı: Siparişin özet bilgileri (örneğin, ürün adı, fiyat, sipariş durumu) denormalize edilmiştir. Bu veri tabanı, sadece okuma işlemleri için optimize edilmiştir ve sorgulama hızını artırır.
Olay Akışı:
- Yazma işlemi (sipariş oluşturma) → Yazma veri tabanına kaydedilir.
- Event (sipariş oluşturulma olayı) → Event listener tarafından dinlenir.
- Okuma veri tabanı güncellenir → Siparişin özet bilgileri eklenir.
- Kullanıcı siparişini sorgular → Okuma veri tabanından hızlı bir şekilde sipariş bilgileri alınır.
Veri Senkronizasyonu:
- Eventual Consistency: Yazma ve okuma veri tabanları arasındaki güncelleme işlemi anında yapılmaz. Bunun yerine "sonunda tutarlılık" sağlanır. Yani, yazma işlemi hemen okuma veri tabanına yansımaz, ancak bir süre sonra okuma veritabanı güncellenir.
- Asenkron Güncellemeler: Okuma veritabanı, yazma veritabanında yapılan değişikliklerden sonra asenkron bir şekilde güncellenir.
Sonuç:
Bu senaryoda CQRS deseni sayesinde, yazma ve okuma işlemleri birbirinden ayrılmıştır. Yazma işlemleri için veri modeli karmaşık ve normalleştirilmiş, okuma işlemleri için ise basit ve hızlı sorgulama için optimize edilmiş bir yapı kullanılmıştır. Bu yaklaşım, yüksek verimlilik ve ölçeklenebilirlik sağlar, çünkü okuma ve yazma işlemleri birbirinden bağımsız olarak optimize edilebilir.
Hiç yorum yok:
Yorum Gönder