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ın tipini değiştir, bir enum değerini düşür, minimum veya minLength’i yükselt, additionalProperties’i kapat. Bir alanı kaldırmak ya da yeniden adlandırmak bu listeye yalnızca yeni şema additionalProperties: false dediğ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’idirbabelqueue-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.

Ara

Yazmaya başlayın. Notlar, sistem yazıları, günlük, araçlar ve sayfalar.

gezesckapat