Ana içeriğe geç

Event Sourcing

Okunuşu
ivent sorsing
Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/event-sourcing

Kısaca

Event sourcing, uygulama durumundaki her değişikliği değiştirilemez bir olay olarak saklayıp güncel durumu olayları yeniden oynatarak kuran tasarım desenidir.

Event sourcing nedir?

Event sourcing, yalnızca nihai sonucu değil, olanı saklayan bir mimari desendir. Sistem, güncel bakiyeyi tutmak için bir satırı güncellemek yerine, olay deposu (event store) adlı yalnızca ekleme yapılan bir günlüğe AccountOpened, MoneyDeposited ve MoneyWithdrawn gibi olaylar ekler. Güncel durum, bu olaylar sırayla yeniden oynatılarak hesaplanır.

Olaylar değiştirilemezdir (immutable): bir kez yazıldıklarında asla düzenlenmez ya da silinmez; hatalar yeni bir düzeltici olay eklenerek giderilir. Her okumada binlerce olayı yeniden oynatmak yavaş olacağından sistemler durumun anlık görüntülerini (snapshot) belirli aralıklarla kaydeder ve yalnızca son anlık görüntüden sonraki olayları oynatır. Ayrıca yeni olayları dinleyerek güncel tutulan, sorgular için optimize edilmiş tablolar olan okuma modellerini, yani projeksiyonları da oluştururlar.

Banka ekstresi iyi bir benzetmedir: bakiyeniz körü körüne güvenmeniz gereken tek bir sayı değil, ekstrede listelenen her para yatırma ve çekmenin toplamıdır. Event sourcing; finans, muhasebe, sipariş işleme ve tam bir denetim izi gerektiren, geçen salı bunun nasıl göründüğü sorusunu yanıtlayabilmek isteyen ya da verileri daha sonra yeni şekillerde yeniden oluşturma seçeneği isteyen her alanda popülerdir.

Event sourcing sıklıkla olay güdümlü mimariyle karıştırılır. Olay güdümlü mimari servislerin olay yayınlayıp bunlara tepki vererek iletişim kurmasıyla ilgilidir; event sourcing ise olayların bir servisin kendi verisi için depolama modeli olarak kullanılmasıyla ilgilidir ve biri diğeri olmadan da kullanılabilir. Çoğunlukla, olayları kaydeden yazma tarafını sorguları sunan okuma tarafından ayıran CQRS ile eşleştirilir. Ödünler gerçektir: olay biçimleri dikkatle evrilmelidir ve okuma modelleri çoğunlukla nihai tutarlıdır, yani en son olayların biraz gerisinde kalabilirler.

Bir bakışta

Bir banka hesabı için event sourcing. Sistem yalnızca bakiyeyi saklamak yerine her değişikliği bir olay günlüğüne ekler: hesap açıldı, 100 yatırıldı, 30 çekildi, 50 yatırıldı. Olayları sırayla yeniden oynatmak güncel bakiye olan 120'yi verir; aynı olaylar aylık hesap özeti gibi bir okuma modelini de besler. Yeni bir olay da basitçe sona eklenir.olay günlüğü (yalnızca ekleme)1AccountOpened2Deposited 1003Withdrew 304Deposited 50sıradaki olay buraya eklenirsırayla oynatBakiye: 1200 + 100 − 30 + 50yansıtAylık hesap özetibir okuma modeli
Olay günlüğü asıl doğru kaynaktır; bakiye ondan hesaplanır, böylece geçmişin tamamı hiç kaybolmaz ve sonradan ondan yeni görünümler kurulabilir.

Önemli noktalar

  • Durum değişiklikleri, yalnızca ekleme yapılan değiştirilemez bir olay dizisi olarak saklanır.
  • Güncel durum, çoğunlukla bir anlık görüntüden başlayarak olaylar yeniden oynatılarak oluşturulur.
  • Tam bir denetim izi sağlar ve geçmiş durumları yeniden oluşturmayı mümkün kılar.
  • Çoğunlukla CQRS ile birleştirilir ama olay güdümlü mimariyle aynı şey değildir.
  • Olay biçimlerinin evrilmesi ve nihai tutarlı okuma modelleri karmaşıklık ekler.

Örnek

Olayları yeniden oynatarak durumu oluşturmaktypescript
type AccountEvent = { type: "MoneyDeposited" | "MoneyWithdrawn"; amount: number };

// The event store only ever appends; past events are never changed
const events: AccountEvent[] = [
  { type: "MoneyDeposited", amount: 100 },
  { type: "MoneyWithdrawn", amount: 30 },
  { type: "MoneyDeposited", amount: 50 },
];

// Rebuild the current balance by replaying every event in order
const balance = events.reduce(
  (total, e) => (e.type === "MoneyDeposited" ? total + e.amount : total - e.amount),
  0,
);
console.log(balance); // 120

Sık sorulan sorular

Event sourcing ile olay güdümlü mimari arasındaki fark nedir?

Event sourcing, bir servisin kendi verisini olay günlüğü olarak saklar; olay güdümlü mimari ise ayrı servislerin iletişim kurması için olayları kullanır. Bir sistem biri olmadan diğerini kullanabilir, ancak çoğunlukla birleştirilirler.

Olay deposu (event store) nedir?

Olay deposu, olayları eklemek ve sırayla geri okumak için tasarlanmış, genellikle bir hesabın tüm olayları gibi varlık başına gruplanmış bir veritabanı ya da günlüktür. Özel bir veritabanı olabileceği gibi yalnızca ekleme yapılacak biçimde kullanılan sıradan bir tablo da olabilir.

Event sourcing ne zaman kullanılmamalı?

Geçmişin iş açısından pek değer taşımadığı basit oluşturma, okuma, güncelleme ve silme uygulamalarında kaçının. Olay sürümleme, yeniden oynatma ve nihai tutarlı okumalar konusunda karmaşıklık ekler; bu ancak denetlenebilirlik ya da geçmiş durumlara ilişkin sorular gerçekten önemliyse karşılığını verir.

İlgili sayfalar

Kaynaklar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar