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.