---
title: "JSON Schema Geriye Dönük Uyumluluk Diff'i"
description: "İki 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."
url: https://sade.dev/tr/tools/schema-compat/
lang: tr
author: "Muhammet Şafak"
published: 2026-06-18
updated: 2026-09-06
section: Tool
tags: ["schema","reliability"]
---

# JSON Schema Geriye Dönük Uyumluluk Diff'i

> İki 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.

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](/tr/journal/sema-evrimi-sozlesmeyi-kirmadan)'nde.

Aşağı yukarı aynı kurallar, tarayıcı yerine CI'da uygulandığında [BabelQueue schema-validation spec'idir](https://babelqueue.com/docs/spec/1.x/schema-validation) — [babelqueue-registry](https://github.com/BabelQueue/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.
