İçeriğe geç
Muhammet Şafak
en
Soran: Rüzgar Cevaplandı:

CQRS'i ne zaman uygulamalı ve okuma/yazma modellerini nasıl senkronlamalıyım?


Soru

Uygulamamızda yazma operasyonları çok az (günde ~5.000 kayıt) ama okuma ve karmaşık raporlama çok yoğun (saniyede ~2.000 sorgu). İlişkisel DB raporlama sorguları yüzünden kilitleniyor. Yazma modelini (PostgreSQL) ve okuma modelini (Elasticsearch veya optimize Read-Replica SQL) tamamen ayırmak (CQRS) istiyoruz. İki model arası senkronizasyonu event-driven, gecikmesiz ve güvenilir nasıl sağlarım?

Cevap

Kısa cevap: Günde 5k yazma karşısında saniyede 2k okuma — bu asimetri gerçekten CQRS’e oynayan bir vaka. Ama en ucuz sürümle başla; doğrudan tam CQRS’e atlama.

Sorun net: ağır raporlama sorguları yazma yolunu da kilitliyor. Çoğu zaman bunu çözmek için tam bir mimari ayrışmaya gerek yok.

  1. Önce read-replica ekle. PostgreSQL’e bir veya birkaç read-replica koy ve tüm raporlama sorgularını oraya yönlendir. Yazma primary’de kalır, okuma replica’da; kilitlenme çoğu zaman sadece bununla biter. Bunu denemeden CQRS karmaşıklığını üstlenme.
  2. Tam CQRS’i ne zaman hak eder anla. Ayrı bir okuma modeli (Elasticsearch ya da denormalize SQL) ancak sorgu şekilleri tek bir şemanın ikisini birden iyi servis edemeyeceği kadar ayrıştığında değer. Full-text arama, ağır agregasyon gibi ihtiyaçlar replica’nın da yetmediği noktada okuma modelini ayırmaya değer kılar.
  3. Modelleri event-driven senkronla. Yazma tarafı her değişiklikte event üretsin; bir projector bu event’leri tüketip okuma modelini güncellesin. Güvenilirlik için outbox pattern kullan: event’i iş verisiyle aynı transaction içinde bir outbox tablosuna yaz, ayrı bir süreç onu yayınlasın — böylece “DB commit oldu ama event kayboldu” durumu olmaz.
  4. Eventual consistency’yi kabul et, dual-write yapma. Okuma modeli yazmadan milisaniye-saniye geride kalır; UI’ı buna göre tasarla (örn. “kaydedildi” anında, listede biraz sonra görünür). Asla uygulamadan iki store’a birden yazma (dual-write) — kaçınılmaz olarak birbirinden kayar (drift). Okuma modelini daima yazma tarafının event’lerinden besle.

Sonuç: Önce replica, raporlamayı oraya taşı. Tam CQRS’i yalnızca sorgu ihtiyaçları gerçekten ayrıştığında, outbox-tabanlı projeksiyonlarla kur — ve eklediğin karmaşıklığı bir maliyet olarak gör. “PostgreSQL bana yeter mi?” sorusunun cevabı çoğu yükte hâlâ evet; CQRS’e geçmeden önce onu sonuna kadar zorla.

İlgili Yazılar

Etiketler: #veritabanı#mimari#elasticsearch
Paylaş:

Yorumlar

Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.

Diğer Sorular

Tüm sorular

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi