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ı kaldır /
yeniden-adlandır / tipini-değiştir, bir
enumdeğerini düşür,minimumveyaminLength’i yükselt,additionalProperties’i kapat.
Yeniden adlandırma, bir kaldırma artı bir eklemedir; o yüzden kırıcı çıkar — doğru biçimde: eski alan adını okuyan bir tüketici onu bulamaz.
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, eski şekildeki yoldaki 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.
Aynı kurallar, tarayıcı yerine CI’da uygulandığında BabelQueue schema-validation spec’idir — babelqueue-registry’deki bqschema aracıyla zorlanır.
Gizlilik
İki şema da tamamen tarayıcında diff’lenir. Hiçbir yere bir şey gönderilmez.