Tool

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 required kısıtını kaldır, bir enum’ı genişlet, bir minimum’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 enum değerini düşür, minimum veya minLength’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’idirbabelqueue-registry’deki bqschema aracıyla zorlanır.

Gizlilik

İki şema da tamamen tarayıcında diff’lenir. Hiçbir yere bir şey gönderilmez.