DBAtlas · Veritabanı operasyon atlası

Referans Mimari: Olay-güdümlü / CQRS

Olay-güdümlü mimaride servisler birbirini doğrudan çağırmak yerine bir olay kaydına (event log, ör. Kafka) olay yayınlar ve tüketiciler bunları asenkron işler. Bu ağaç; olay omurgasını kurmaktan başlayarak event sourcing (durumu olaylardan türetme), CQRS ile komut/sorgu ayrımı, okuma modeli projeksiyonu, idempotency, eventual consistency toleransı ve 'exactly-once teslim' yanılgısını adım adım ele alır. Amaç; gevşek bağlı, ölçeklenebilir ama tutarlılık ödünleşimleri iyi anlaşılmış bir sistem kurmaktır.

Olay-güdümlü mimaride hangi kararla uğraşıyorsun?

Olay-güdümlü sistemin temeli, servisleri asenkron olaylarla bağlayan dayanıklı bir olay kaydıdır. Henüz omurgayı mı kuruyorsun, durumu olaylardan mı türetmek (event sourcing) istiyorsun, yoksa okuma/yazma yollarını mı ayırıyorsun (CQRS)?

  • Servisleri bağlayan olay omurgasını kuruyorum
  • Durumu olay geçmişinden türetmek istiyorum
  • Okuma ve yazma yollarını ayırmak istiyorum (CQRS)

CQRS'te okuma tarafını nasıl kuracaksın, tutarlılık toleransın ne?

CQRS'te komut (yazma) ve sorgu (okuma) tarafları ayrılır; yazma olayları, okuma modelini besleyen projeksiyonu günceller. Kritik soru: okuma modelinin yazmanın gerisinde kalmasını (eventual consistency) tolere edebiliyor musun, yoksa her olayın tam-bir-kez işlenmesini mi bekliyorsun?

  • Okuma modelini olaylardan projeksiyonla besleyeceğim
  • Okuma anında güncel olmalı; gecikme kabul edilemez
  • Olaylar 'tam bir kez' işlensin istiyorum

Öneri: Dayanıklı olay kaydı (event log) omurgası

Olay-güdümlü mimarinin merkezinde, üreticilerin olay yazdığı ve tüketicilerin kendi hızında okuduğu dayanıklı, sıralı bir olay kaydı (log) bulunur. Bu omurga servisleri zaman ve ölçek olarak birbirinden ayırır.

Öneri: Event sourcing (durumu olaylardan türet)

Event sourcing'de bir varlığın güncel durumunu değil, ona olan tüm değişiklik olaylarını (immutable) saklarsın; güncel durum bu olayların sırayla uygulanmasıyla türetilir. Tam denetim geçmişi ve geçmişteki herhangi bir ana geri dönebilme sağlar.

Öneri: Okuma modeli projeksiyonu

CQRS'te yazma tarafı olay üretir; bir projeksiyon bu olayları dinleyip sorguya optimize bir okuma modeli (denormalize görünüm) günceller. Okumalar bu hazır modelden yapılır, yazma yolundan tamamen ayrılır ve her iki taraf bağımsız ölçeklenir.

Öneri: Eventual consistency toleransını tasarla

Olay-güdümlü/CQRS sistemlerinde okuma modeli yazmanın kısa bir süre gerisinde kalır (eventual consistency). Bunu 'yok etmeye' çalışmak yerine tolere edecek biçimde tasarlamak gerekir; katı anlık tutarlılık gereken az sayıdaki akışı ayrı tutarsın.

Öneri: Idempotency (exactly-once yanılgısı)

Dağıtık mesajlaşmada uçtan uca 'exactly-once teslim' pratikte bir yanılgıdır; ağ ve yeniden denemeler nedeniyle mesaj tekrarları kaçınılmazdır. Doğru hedef, işlemeyi idempotent yapmaktır: aynı olayı iki kez işlemek tek kez işlemekle aynı sonucu vermeli.

DBAtlas'ta aç →