Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Истории успеха
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • ML Services
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Истории успеха
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex MetaData Hub
  • О сервисе Yandex MetaData Hub
    • Начало работы
      • Реестр схем
      • Совместимость JSON-схем
      • Контентные модели и проблемы эволюции JSON-схем
      • Политики проверки совместимости
    • Сервисные роли для управления доступом
    • Решение проблем
  • Управление доступом
  • Квоты и лимиты
  • Правила тарификации
  • Публичные материалы
  • История изменений

В этой статье:

  • Контентные модели JSON-схем
  • Открытая контентная модель
  • Закрытая контентная модель
  • Частично открытая контентная модель
  • Особенности эволюции JSON-схем в контентных моделях
  • Открытая контентная модель
  • Закрытая контентная модель
  • Частично открытая контентная модель
  • Сохранение совместимости при эволюции опциональных параметров
  • См. также
  1. Schema Registry
  2. Концепции
  3. Контентные модели и проблемы эволюции JSON-схем

Контентные модели и проблемы эволюции JSON-схем

Статья создана
Yandex Cloud
Обновлена 8 сентября 2025 г.
  • Контентные модели JSON-схем
    • Открытая контентная модель
    • Закрытая контентная модель
    • Частично открытая контентная модель
  • Особенности эволюции JSON-схем в контентных моделях
    • Открытая контентная модель
    • Закрытая контентная модель
    • Частично открытая контентная модель
  • Сохранение совместимости при эволюции опциональных параметров
  • См. также

Yandex Schema Registry поддерживает работу со схемами Avro, Protobuf и JSON Schema. Схемы Avro и Protobuf основываются на заранее определенной структуре, которая строго поддерживается и регулирует эволюцию схем. В отличие от них, JSON-схема не требует заранее определенной структуры, поэтому не имеет строго описанных правил эволюции схемы. Из-за этого поведение JSON-схемы при работе с опциональными параметрами отличается от поведения схем Avro и Protobuf.

Например, добавление опционального параметра в схему Avro или Protobuf считается совместимым изменением схемы, а в JSON-схеме это же действие может как нарушить, так и не нарушить совместимость схем, в зависимости от используемой контентной модели.

Чтобы сохранить совместимость при эволюции JSON-схем, применяются проверки совместимости, правила которых задаются политиками проверки совместимости. В Schema Registry реализованы следующие политики для JSON-схем:

  • Confluent — не позволяет добавлять и удалять опциональные параметры в полях типа object. Иногда это ограничение может быть избыточным, например при работе с очередями.

  • Optional Friendly — позволяет добавлять и удалять опциональные параметры в полях типа object, сохраняя полную транзитивную совместимость.

В этой статье описываются теоретические основы и реализация политики Optional-friendly.

Совет

Если вы хотите использовать в Data Transfer JSON-схему с политикой проверки совместимости Optional-friendly:

  1. Задайте в пространстве имен политику проверки совместимости Optional-friendly.

  2. Задайте в настройках сериализации эндпоинта-приемника Yandex Managed Service for Apache Kafka® следующие настройки Debezium:

    • Для ключа схемы: key.converter.dt.json.generate.closed.content.schema — true.
    • Для значения схемы: value.converter.dt.json.generate.closed.content.schema — true.

Контентные модели JSON-схемКонтентные модели JSON-схем

Контентная модель — это совокупность правил, по которым может изменяться поле типа object в схеме. У разных полей в одной схеме могут быть разные контентные модели.

В JSON Schema существуют следующие контентные модели:

  • открытая контентная модель;
  • закрытая контентная модель;
  • частично открытая контентная модель.

Открытая контентная модельОткрытая контентная модель

В открытой контентной модели можно использовать параметры, заданные в схеме, а также добавлять новые параметры любого типа. Эта модель используется по умолчанию.

Описание схемы в открытой контентной модели выглядит так:

{
  "type": "object",
  "properties": {
    "name": {"type": "string"},
    "age": {"type": "integer"}
  },
  "additionalProperties": true
}

Где additionalProperties — возможность добавления параметров, true или false. По умолчанию параметр имеет значение true, поэтому при описании схем в открытой контентной модели он часто опускается.

Закрытая контентная модельЗакрытая контентная модель

В закрытой контентной модели можно использовать только параметры, заданные в схеме. Добавлять новые параметры нельзя.

Описание схемы в закрытой контентной модели выглядит так:

{
  "type": "object",
  "properties": {
    "name": {"type": "string"},
    "age": {"type": "integer"}
  },
  "additionalProperties": false
}

Частично открытая контентная модельЧастично открытая контентная модель

Частично открытая контентная модель позволяет добавлять новые параметры, если они соответствуют заданным ограничениям. Задать ограничения можно следующими способами:

  • Разрешить добавление параметров только определенного типа, указав тип параметра в additionalProperties.
  • Разрешить добавление параметров определенных типов с именем заданного вида, перечислив регулярные выражения для имен и соответствующие им типы параметров в объекте patternProperties.
Ограничение по типу добавляемого параметраОграничение по типу добавляемого параметра

Допустимые типы новых параметров описываются в параметре additionalProperties. Добавлять параметры другого типа нельзя.

Описание схемы выглядит так:

{
  "type": "object",
  "properties": {
    "name": {"type": "string"},
    "age": {"type": "integer"}
  },
  "additionalProperties": {"type": "string"}
}

Эта схема разрешает добавлять только новые параметры типа string.

Ограничение по типу добавляемого параметра на основе префикса имени параметраОграничение по типу добавляемого параметра на основе префикса имени параметра

Параметр additionalProperties имеет значение false, как в закрытой схеме. Допустимые новые параметры описываются в объекте patternProperties, при этом имени каждого параметра присваивается префикс, указывающий на тип параметра. Имена параметров в схеме описываются регулярными выражениями. Нельзя добавлять параметры, не описанные в patternProperties.

Описание схемы выглядит так:

{
  "type": "object",
  "properties": {
    "s_name": {"type": "string"},
    "i_age": {"type": "integer"}
  },
  "patternProperties": {
    "^s_": {"type": "string"},
    "^i_": {"type": "integer"}
  },
  "additionalProperties": false
}

Эта схема разрешает добавлять только:

  • Параметры типа string, имена которых начинаются с s_.
  • Параметры типа integer, имена которых начинаются с i_.

Особенности эволюции JSON-схем в контентных моделяхОсобенности эволюции JSON-схем в контентных моделях

Эволюция схемы — это изменение одного или нескольких параметров схемы или их свойств. В JSON-схеме возможны следующие изменения:

  • добавление нового обязательного параметра;
  • добавление нового опционального параметра;
  • удаление обязательного параметра;
  • удаление опционального параметра;
  • изменение типа параметра с опционального на обязательный;
  • изменение типа параметра с обязательного на опциональный.

Открытая и закрытая контентные модели по-разному ограничивают возможности эволюции схемы при сохранении совместимости с предыдущими схемами. Конкретные ограничения зависят от модели.

Открытая контентная модельОткрытая контентная модель

Изменение схемы Прямая совместимость Обратная совместимость Полная совместимость
Добавление обязательного параметра
Добавление опционального параметра
Удаление обязательного параметра
Удаление опционального параметра
Изменение опционального параметра на обязательный
Изменение обязательного параметра на опциональный

Закрытая контентная модельЗакрытая контентная модель

Изменение схемы Прямая совместимость Обратная совместимость Полная совместимость
Добавление обязательного параметра
Добавление опционального параметра
Удаление обязательного параметра
Удаление опционального параметра
Изменение опционального параметра на обязательный
Изменение обязательного параметра на опциональный

Частично открытая контентная модельЧастично открытая контентная модель

Частично открытая контентная модель позволяет добавлять новые параметры с сохранением совместимости, указывая тип параметра в additionalProperties. Однако таким способом можно добавлять в модель только параметры одного типа.

Чтобы добавить параметры сразу нескольких типов, перечислите в patternProperties типы параметров, присвоив именам параметров соответствующий префикс. Необходимо описать все возможные параметры, включая объекты object и массивы array.

Такая реализация имеет следующие недостатки:

  • Схема становится громоздкой и трудноподдерживаемой.
  • Возможную ошибку в patternProperties нельзя исправить без потери совместимости.
  • Нельзя использовать новые типы параметров, если такие будут добавлены в спецификацию JSON, потому что они не описаны в patternProperties.
  • Схема работает, только если имена всех параметров строго соответствуют описанным шаблонам. Это возможно, только если вы контролируете производителя данных.

Сохранение совместимости при эволюции опциональных параметровСохранение совместимости при эволюции опциональных параметров

Используя открытые и закрытые контентные модели JSON-схем, невозможно обеспечить полную совместимость при добавлении или удалении опциональных параметров. Это приводит к возникновению ошибок PROPERTY_ADDED_TO_OPEN_CONTENT_MODEL и PROPERTY_REMOVED_FROM_CLOSED_CONTENT_MODEL при операциях с опциональными параметрами. Частично открытая контентная модель обеспечивает совместимость в этих случаях, но имеет существенные недостатки.

Альтернатива применению конкретной модели — использовать разные контентные модели для производителей и потребителей данных:

  • Производитель должен использовать закрытую контентную модель, потому что на стороне производителя всегда известен точный набор параметров.
  • Потребитель должен использовать открытую контентную модель, потому что потребители получают набор параметров только из поступающих данных, а неизвестные параметры игнорируются.

При этом в реестре схем регистрируется только схема данных производителя. Схема для потребителя генерируется по необходимости на основе схемы производителя, но не регистрируется в реестре. Единственным отличием схем производителя и потребителя становится использование разных контентных моделей. Это сводит проверку совместимости схем к конвертации схемы потребителя из открытой контентной модели в закрытую и проверке схем в реестре производителя. Если аналогичная схема зарегистрирована в реестре для производителя, то проверка на совместимость пройдена. В то же время схема потребителя может содержать дополнительные параметры из других зарегистрированных схем производителя. Для поддержки полной транзитивной совместимости требуется, чтобы схема потребителя была совместима хотя бы с одной зарегистрированной схемой производителя. Подробнее о теоретическом обосновании и прикладных аспектах такого решения.

Schema Registry поддерживает проверку совместимости схем через конвертацию открытой схемы потребителя в закрытую. Для этого задайте в пространстве имен для JSON-схем политику проверки совместимости Optional-friendly. Вы можете задать политику для нового пространства имен или изменить ее для существующего пространства. Чтобы политика Optional-friendly работала корректно, схемы в пространстве имен должны создаваться по закрытой контентной модели.

Вы также можете использовать это решение для сохранения совместимости JSON-схем при поставке данных в Yandex Managed Service for Apache Kafka® через Yandex Data Streams Yandex Data Transfer. Подробнее о требуемых настройках эндпоинта Data Transfer см. в инструкции.

См. такжеСм. также

  • Роберт Йокота — Понимание совместимости JSON-схем (англ.)
  • Энди Котс — Эволюция JSON-схем, часть 1 (англ.)
  • Энди Котс — Эволюция JSON-схем, часть 2 (англ.)

Была ли статья полезна?

Предыдущая
Совместимость JSON-схем
Следующая
Политики проверки совместимости
Проект Яндекса
© 2025 ООО «Яндекс.Облако»