JSON Schema Geriye Dönük Uyumluluk Diff'i
Bir mesajın data'sı için iki JSON Schema'yı diff'le; değişiklik backward-compatible mi, yoksa yeni bir mesaj sürümü gerektiren kırıcı bir değişiklik mi? Tarayıcıda çalışır.
Bu araç tarayıcınızda çalışır. Veriler dışarı çıkmaz.
Nasıl Çalışır
Bir mesajın data bloğu için iki JSON Schema — eski ve yeni — ve tek bir soru: yeni şemaya
yükselten bir tüketici, eski şemayla üretilmiş mesajları hâlâ okuyabilir mi? Evetse, ship et.
Hayırsa, eskisini değiştirmek yerine mesaj kimliğini sürümlersin. Bu, bir backward-compat
linter’ının uygulayacağı kuralların aynısını tarayıcında uygular.
Ne kırıcı sayılır
Uyumluluk asimetriktir — gevşetmek güvenli, sıkılaştırmak değil:
- Güvenli: opsiyonel alan ekle, bir
requiredkısıtını kaldır, birenum’ı genişlet, birminimum’u gevşet. - Kırıcı: zorunlu alan ekle (ya da var olanı zorunlu yap), bir alanın tipini değiştir,
bir
enumdeğerini düşür,minimumveyaminLength’i yükselt,additionalProperties’i kapat. Bir alanı kaldırmak ya da yeniden adlandırmak bu listeye yalnızca yeni şemaadditionalProperties: falsedediğinde katılır — içerik modelini açık bırakırsan, kaldırılan alanı hâlâ taşıyan eski bir mesaj sorunsuz doğrulanır.
Yeniden adlandırma, bir kaldırma artı bir eklemedir; o yüzden kapalı içerik modelinde kırıcı
çıkar — doğru biçimde: yeni alan adını bekleyen bir tüketici onu eski mesajlarda bulamaz.
additionalProperties’i açık bırak, diff temiz döner; çünkü yalnızca eski mesajların hâlâ
doğrulanıp doğrulanmadığına bakar, tüketicinin artık okuduğu alanı bulup bulamayacağına
değil.
Kırıcı değişiklik neden yeni bir URN ister
Dağıtık bir sözleşmeyi atomik değiştiremezsin: üreticiler ve tüketiciler bağımsız deploy olur
ve at-least-once teslimatla, yoldaki eski şekilli mesajlar sen yenisini yayarken gelmeye
devam eder. Yani kırıcı bir değişiklik yeni bir kimlik (orders.created.v2) demektir;
eskisinin tüketicisi kalmayana dek paralel koşturulur — asla eskisinin sessiz yeniden tanımı
değil. Uzun gerekçe Şema Evrimi’nde.
Aşağı yukarı aynı kurallar, tarayıcı yerine CI’da uygulandığında BabelQueue schema-validation spec’idir — babelqueue-registry’deki bqschema aracıyla zorunlu kılınır. İkisinden katı olanı spec: alan kaldırmayı ya da yeniden adlandırmayı koşulsuz kırıcı sayar, tarayıcıdaki diff ise bunu yalnızca kapalı içerik modelinde işaretler.
Gizlilik
İki şema da tamamen tarayıcında diff’lenir. Hiçbir yere bir şey gönderilmez.