Yazılım Notları

Mimari ve Dağıtık Sistemler

Production'ı Bozmadan Breaking Change: Event Upcasting ve Schema Evolution

Breaking Changes Without Breaking Production: Event Upcasting and Schema Evolution

Event sourcing'de geçmiş değiştirilemez; şema değişikliklerini eski event'leri okurken dönüştüren upcaster'lar ve disiplinli versiyonlamayla yönetirsiniz, 2026'da yaygınlaşan Dynamic Consistency Boundary yaklaşımında da bu kural değişmiyor.

Kabul görüyor

Event sourcing'de geçmiş yeniden yazılmaz; kırıcı şema değişikliği, eski event'i okuma anında güncel şemaya çeviren versiyonlu upcaster'larla yönetilir.

Axon, Marten ve saha çalışmaları upcasting'i varsayılan yol sayıyor; kopyala-dönüştür yanlıları uzun zincirlerde ve yasal silmede istisna istiyor.

Zihinsel model

Event deposu noterdeki tutanak defteridir: sayfayı yırtmazsın, okurken güncel dile çeviren bir tercüman eklersin.

Neden

  • Denetim izi, replay ve projeksiyon yeniden kurulumu event'lerin değişmezliğine dayanır; depodaki veriyi değiştirmek bunları bozar.
  • Upcaster zinciri her eski biçimi tek güncel biçime çevirir; uygulama kodu yalnızca son şemayı bilir.
  • Adı aynı kalıp anlamı değişen alan sessizce yanlış hesap üretir; versiyon numarası bu değişikliği görünür kılar.

Kanıt

Sanayiden 19 event sourced sistem üzerine yapılan saha çalışması, ekiplerin versiyonlu event, upcasting ve kopyala-dönüştür arasında seçim yaptığını gösteriyor.

An Empirical Characterization of Event Sourced Systems and Their Schema Evolution (arXiv), 2021

Axon Framework 5 yeni tutarlılık modeline geçerken upcaster'ları geçici kaldırdı, sonra 'message transformation' adıyla geri getirdi.

Axon Framework 5 Reference: Event Versioning, 2025

Marten upcast'i ham JSON üzerinde yaparak eski event sınıflarını kod tabanında tutma zorunluluğunu kaldırıyor.

Marten Docs: Events Versioning, 2026

Karşı görüş

Zincir uzadıkça okuma gecikmesi ve bakım yükü büyür. Kişisel veri silinmesi gerektiğinde upcasting yetmez; kopyala-dönüştür ya da crypto-shredding gerekir.

Kavramlar

UpcastingEski şemadaki event'i okurken güncel şemaya çevirmek; depodaki veri değişmez.
Upcaster ChainHer biri bir sonraki versiyona çeviren saf fonksiyonların sıralı uygulanması.
Tolerant ReaderBilinmeyen alanı yok sayan, eksik alana açık varsayılan veren okuyucu.
Copy-transformAkışı dönüştürerek yeni depoya kopyalamak; ağır ama uzun zincirleri temizler.
Dynamic Consistency BoundaryEvent'leri etiketlere bağlayan model; etiket şeması da versiyonlanacak bir sözleşmedir.

Pratikte

  • Event sınıfını sözleşme say; IDE ile rename yerine yeni versiyon ve upcaster yaz.
  • Her event versiyonu için gerçek fixture sakla, CI'da zincirin tamamını test et.
  • Servisler arası integration event'leri iç domain event'lerinden ayır, schema registry ile uyumluluk kuralı koy.
Önce bunu okuSimple patterns for events schema versioning (Oskar Dudycz)Basit eşlemeden upcasting ve migration'a desenleri kod örnekleriyle sıralıyor.