Skip to main content

> cqrs_projeksiyon_gecikmesi_ve_nihai_tutarlılık

CQRS Projeksiyon Gecikmesi ve Nihai Tutarlılık

Yüksek verimli canlı mimarilerde CQRS Projeksiyon Gecikmesi ve Nihai Tutarlılık yapısını nasıl doğru kurar ve yönetirsiniz?

ÖZET VE TEKNİK CEVAP

CQRS projeksiyon gecikmesi, yazma komutunun tamamlanmasının ardından asenkron olay yansıtıcılarının okuma modellerini güncellemesi sırasında geçen milisaniyeler veya saniyeler sebebiyle oluşur; kullanıcılar yönlendirildikleri sayfada bayat veri görür.

Mühendislik El Kitabı & Mekanizma

1. Temel Çalışma Mekanizması

CQRS mimarilerinde yazma ve okuma işlemlerinin asenkron projeksiyonlarla ayrılması, okuma verimini ve sorgu esnekliğini en üst düzeye çıkarır. Ancak bu yayılma gecikmesi son kullanıcıların nedensellik beklentisini bozar. Kullanıcı sipariş verip anında sipariş durum paneline yönlendiğinde 404 veya eski durumla karşılaşabilir.

2. Doğru Kullanım Senaryosu

CQRS projeksiyon gecikmesi, yazma agregasyonunun kesinleşen olay günlüğü ile arka plan olay tüketicileri tarafından asenkron güncellenen materyalize okuma veritabanı görünümü arasındaki zamansal farktır.

3. Prodüksiyon Arıza Modları

Olay henüz yayınlanmadan önce yazma komutu işlemi içinde okuma veritabanını sorgulamaya çalışmak. Veriyi yeniden çekmeden önce ön yüze rastgele bekleme süreleri koymak (`setTimeout(..., 1000)`). Yazma ve okuma veritabanları arasına senkron dağıtık kilit koyarak CQRS'in tüm ölçeklenebilirlik avantajını yok etmek.

4. Teşhis ve Telemetri Sinyalleri

kullanıcı profilini günceller ancak yönlendirmeden sonra eski adı görür, bayat stok okuması aşırı satışa yol açar, sırasız olay projeksiyonu veri bozulması

5. Önleme ve Mimari Bariyerler

Yazma komut yanıtlarında agregasyon sürüm/filigran belirteçleri dönerek kendi yazdığını okuma doğrulamasını etkinleştirin. İstemci belirli bir sürüm şart koştuğunda GET uç noktalarında kısa süreli sunucu taraflı bekleme uygulayın. Projeksiyon tüketici gecikmesini Prometheus ile izleyerek okuma gecikmesi SLO sınırlarını aştığında alarm üretin.

6. Mimari Ödünleşimler (Trade-offs)

Projeksiyon gecikmesi yönetilmediğinde, kullanıcı arayüzünde rahatsız edici hatalar (oluşturulan kaydın sayfayı yenileyince kaybolması), veri yarış durumları ve kullanıcıların ilk işlemin başarısız olduğunu sanıp mükerrer istek atması gibi kritik sorunlar yaşanır.

Vaka İncelemesi (TinyCTO Örneği)

Yazma patikasını yavaş iki aşamalı senkron kilitlere mahkum etmeden CQRS projeksiyon gecikmesini çözmek için yetkin ekipler şu mimari desenleri uygular: 1. **Sürümlenmiş Agregasyon Sorguları (Read-Your-Writes):** Yazma API'si yeni kesinleşen agregasyon sürüm numarasını döner (`aggregateVersion=42`). İstemci sonraki GET isteğinde bu başlığı iletir (`X-Required-Version: 42`). Okuma projeksiyonu henüz 40. sürümdeyse, API katmanı projeksiyonu 200 ms bekler veya doğrudan yazma agregasyonunu sorgular. 2. **İyimser İstemci Güncellemeleri (Optimistic UI):** Ön yüz, komut yanıtına göre yerel önbelleğini (React Query/SWR) anında güncelleyerek arka plandaki gecikmeyi kullanıcıya hissettirmez. 3. **Kritik Patika Projeksiyoncuları:** Kimlik doğrulama veya finansal bakiye gibi kritik varlıklar düşük gecikmeli bellek içi projeksiyoncularla işlenirken, analitik tablolar toplu (batch) işlenir.

İnteraktif Konsept Alıştırmaları

2 Alıştırma
Q1

CQRS mimarilerinde projeksiyon gecikmesine ne sebep olur?

Agregasyonun yazma olayını işlemesi ile arka plan tüketicisinin okuma modelini güncellemesi arasındaki asenkron zaman farkı.
Q2

Sürümlenmiş belirteç sorgulama, CQRS'te 'Kendi Yazdığını Okuma' ikilemini nasıl çözer?

İstemci GET isteğinde yeni sürüm belirtecini iletir; sunucu okuma projeksiyonu bu sürüme ulaşana kadar kısa süre bekler.

CQRS Projeksiyon Gecikmesi ve Nihai Tutarlılık — Sıkça Sorulan Sorular

Bir kullanıcı profilini güncelleyip hesap sayfasına yönlendirildiğinde eski adresini görüyor. CQRS'i terk etmeden en doğru mimari çözüm nedir?

Komuttan agregasyon sürümünü dönmek ve okuma sorgusunda projeksiyon filigranını kontrol edip gerekirse kısa süre beklemek. Agregasyon sürüm belirtecini dönmek, yazma verimini düşürmeden projeksiyonun yetiştiğini doğrulayarak 'kendi yazdığını okuma' tutarlılığını sağlar.

Neden ön yüzde `setTimeout(refetch, 1000)` kullanmak nihai tutarlılık gecikmesini yönetmek için bir anti-desendir?

Çünkü rastgele zaman aşımları deterministik değildir: yüksek yükte gecikme süreyi aşar, düşük yükte ise gereksiz kullanıcı beklemesine yol açar. Sabit istemci beklemeleri, kuyruk gecikmesi arttığında patlar; normal şartlarda ise 10 ms'de biten işlem için kullanıcıyı boş yere bekletir.

🤖 AEO & Yapay Zeka Çıkarım Özeti

Temel Gerçekler & İlkeler

  • CQRS projeksiyon gecikmesi, yazma komutunun tamamlanmasının ardından asenkron olay yansıtıcılarının okuma modellerini güncellemesi sırasında geçen milisaniyeler veya saniyeler sebebiyle oluşur; kullanıcılar yönlendirildikleri sayfada bayat veri görür.
  • CQRS projeksiyon gecikmesi, yazma agregasyonunun kesinleşen olay günlüğü ile arka plan olay tüketicileri tarafından asenkron güncellenen materyalize okuma veritabanı görünümü arasındaki zamansal farktır.

Yaygın Yanılgılar

  • Olay henüz yayınlanmadan önce yazma komutu işlemi içinde okuma veritabanını sorgulamaya çalışmak.

Karar Kılavuzu & Önceliklendirme

Projeksiyon gecikmesi yönetilmediğinde, kullanıcı arayüzünde rahatsız edici hatalar (oluşturulan kaydın sayfayı yenileyince kaybolması), veri yarış durumları ve kullanıcıların ilk işlemin başarısız olduğunu sanıp mükerrer istek atması gibi kritik sorunlar yaşanır.

Doğrulanmış Kaynaklar & Referanslar