Проектирование и оценка
Создано 15.10.2026
Обновлено 15.10.2026
Зачем нужен реестр схем, чем отличаются backward и forward compatibility и как выпускать версии JSON Schema. Проверки, активация, миграции и откат.
Schema Registry, или реестр схем, хранит идентифицируемые версии описания данных и помогает управлять их использованием. Он нужен, когда несколько приложений независимо создают и читают сообщения, настройки или документы, а старая информация продолжает жить после выпуска новой версии.
Сначала определите, какую совместимость нужно сохранить: чтение старых данных новым потребителем, чтение новых данных старым потребителем или оба направления. Затем выберите формат схем, режим проверки, способ доставки и порядок активации. Реестр не исправляет смысл полей и не выполняет миграцию автоматически.
Результат — согласованный порядок изменения контракта: неизменяемые версии, перечень потребителей, проверки совместимости и поведения, управляемый выпуск и проверенный путь восстановления. Ниже разберём учебный пример JSON Schema, роли команды и условия, при которых достаточно Git и процесса поставки.
В распределённой системе производитель и потребитель данных могут выпускаться разными командами. Новая версия сервиса начинает отправлять поле, которого старый обработчик не знает, либо новый обработчик делает обязательным то, чего нет в истории. Реестр делает описание формата доступным по устойчивой идентичности и помогает контролировать изменения.
| Объект | Что нужно различать | Для чего используется |
|---|---|---|
Логический контракт | Событие, документ или тип настройки | Объединяет версии одного назначения |
Версия схемы | Неизменяемое содержимое и идентификатор | Позволяет воспроизводимо проверить конкретные данные |
Диалект или формат | JSON Schema, Avro, Protobuf и их поддерживаемые версии | Определяет правила интерпретации и совместимости |
Статус использования | Подготовлена, разрешена к применению, выведена из новых записей | Управляет выпуском и переходным периодом |
Потребители и владелец | Кто создаёт и читает данные, кто согласует изменение | Помогает оценить влияние и организовать миграцию |
Конкретный продукт может называть логическую группу subject, schema group или иначе. Номер версии внутри группы и глобальный идентификатор схемы также могут быть разными сущностями. Сначала проверьте модель выбранного реестра. Например, Confluent Schema Registry API различает регистрацию, версии и получение схем.
Schema Registry — общая архитектурная роль и класс решений; реестр не становится частью Apache Kafka только из-за совместного использования. Реализации отличаются форматами, протоколом сериализации и способом доставки идентификатора схемы. Нельзя переносить детали одного продукта на любой API или очередь. В Azure Event Hubs реестр находится в отдельном продуктовом контексте со своей моделью групп и форматов.
Для небольшой системы может быть достаточно схем в Git, неизменяемого пакета релиза и явного выбора версии в приложении. Это уже управляемая доставка контрактов, если известны активная версия, потребители и процедура возврата. Отдельный сетевой сервис оправдан, когда нужны независимая регистрация, обнаружение версий или управление большим числом потребителей. Он добавляет эксплуатационные обязанности и не нужен автоматически.
Выбор способа хранения данных решается отдельно. Реестр не определяет, использовать ли JSONB в PostgreSQL, обычные колонки или EAV. Его задача — помочь воспроизводимо интерпретировать данные и управлять изменениями контракта.
Совместимость нужно определять относительно направления чтения. Формулировка «изменение обратно совместимо» без указания производителя, потребителя и поддерживаемых версий оставляет разные трактовки. Полезно сразу записать, какие сочетания должны работать во время перехода.
| Направление | Контрольный вопрос | Что проверить |
|---|---|---|
Backward compatibility | Читает ли новый потребитель данные старого производителя? | Сохранённые документы, историю сообщений и старые отправители |
Forward compatibility | Читает ли старый потребитель данные нового производителя? | Старые клиенты, обработчики и закрытые схемы |
Full compatibility | Сохраняются ли оба направления? | Проверки backward и forward на нужных версиях |
Transitive-проверка | Сравниваем ли со всей поддерживаемой историей? | Не только соседнюю версию, но и версии в периоде хранения и поддержки |
Эти направления описывают взаимодействие производителя и потребителя, а не обещают, что любые программы с валидным документом будут работать одинаково. Автоматический анализ зависит от формата и инструмента. В документации Confluent по эволюции схем для форматов выделены отдельные правила; правила Avro нельзя без проверки применять к JSON Schema.
Рассмотрим условное правило оповещения из введения в JSON Schema. В версии 1 допустимы только enabled и threshold, оба поля обязательны, additionalProperties равно false. В версии 2 добавили необязательное поле channel со значениями email и webhook.
{
"enabled": true,
"threshold": 20,
"channel": "email"
}Старый документ без channel пройдёт новую схему. Но приведённый новый документ не пройдёт старую: она запрещает неизвестное поле. Значит, добавление необязательного свойства в этом примере сохраняет приём старых документов новым валидатором, но не гарантирует обратное направление. Совместимость определяется конкретными схемами и поведением клиентов.
| Изменение | Что происходит со старыми документами | Риск для старых потребителей |
|---|---|---|
Новое обязательное поле | Без миграции могут не пройти новую схему | Могут отклонять новое поле или не понимать его |
Расширение enum | Прежние варианты остаются допустимыми | Новый вариант может отсутствовать в коде или старой схеме |
Сужение диапазона | Ранее допустимые значения могут стать ошибочными | Зависит от того, какие значения создаёт новый производитель |
Смена единицы измерения | Структурная проверка может остаться успешной | Данные читаются, но интерпретируются неверно |
default в JSON Schema не вставляет значение автоматически. Поэтому обязательное новое поле с default не делает прежние документы валидными без дополнительного поведения приложения. В Avro значение по умолчанию участвует в другом механизме чтения; одинаковое название не означает одинаковую семантику. Для JSON Schema это прямо объясняет руководство по аннотациям.
Разделите подготовку, доставку артефакта и разрешение его использования. Успешная генерация документации не означает, что работающие приложения получили новую схему. Регистрация также не доказывает, что все потребители готовы к новым данным. Для вашего решения нужно явно определить, кто и когда выбирает версию.
Версия разрешается к применению после успешных проверок. При отказе она остаётся кандидатом; миграция данных и порядок выпуска согласуются отдельно.
Пример с одной активной версией относится к каталогу конфигураций: приложение может выбирать её для новых объектов. В потоковой системе одновременно могут использоваться несколько разрешённых версий. Не навязывайте единый глобальный указатель «активная» там, где архитектура его не предполагает.
Можно проверить тысячу существующих документов и пропустить значение, которое допускает старая схема, но ещё не встречалось. Анализ совместимости ограничений и проверка корпуса данных отвечают на разные вопросы. Первый оценивает отношения между правилами, второй обнаруживает реальные данные и ошибки миграции. Тесты потребителей добавляют проверку поведения, включая смысл enum и единиц.
Формат версии в документе или сообщении должен позволять однозначно получить контракт. Это может быть поле конверта, заголовок протокола или идентификатор в согласованном формате сериализации. Не заменяйте эту связь догадкой по набору полей. Порядок и ошибки зафиксируйте в документации интеграций.
Реестр становится зависимостью системы, если приложение обращается к нему во время обработки. Определите, что происходит при недоступности: используется ли ранее проверенный локальный артефакт, на какой срок допустим кэш и как обрабатывается неизвестная версия. Молчаливый переход к произвольной последней схеме может изменить смысл проверки.
| Область | Что согласовать | Пример проверяемого результата |
|---|---|---|
Публикация | Кто создаёт и согласует версии, какие проверки обязательны | Непроверенная версия не становится доступной для новых записей |
Доставка и кэш | Когда загружается схема и что делать без реестра | Известная версия читается в допустимом режиме; неизвестная явно отклоняется |
Ссылки и доверие | Разрешённые источники и набор зависимостей схем | Схема не вызывает произвольную сетевую загрузку из пользовательского ввода |
Наблюдение | Ошибки по версии, потребителю и причине без утечки данных | Можно различить неизвестную схему и невалидный документ |
Возврат и миграция | Поддерживаемые версии приложений и данных | Восстановление проверено вместе с уже созданными новыми документами |
Откат схемы не всегда равен откату системы. После активации могли появиться документы, которые старое приложение не понимает. Нужно либо сохранить совместимое чтение, либо преобразовать эти документы, либо предусмотреть иной план восстановления. До выпуска проверьте конкретный сценарий, а не только возможность переключить номер версии.
Неизменяемость версии помогает воспроизводимости: исправление схемы выпускается новым артефактом вместо тихой замены содержимого по прежнему идентификатору. Связанные схемы также должны разрешаться воспроизводимо. Контроль целостности полезен при доставке, но hash не заменяет описание изменений и решение об их допустимости.
Роли можно распределить без отдельного комитета. Аналитик согласует смысл полей и единиц; владелец данных — допустимые изменения и миграцию; архитектор — совместимость, границы и доступность; инженер — реализацию проверок, доставку и тесты. В небольшой команде один человек совмещает роли, но решения всё равно должны быть явными.
Схемы, загруженные внешними пользователями или плагинами, требуют ограничений ресурсов и проверки доверия. Поддерживаемые ключевые слова, форматы, расширения и разрешение ссылок составляют профиль системы. Один и тот же JSON Schema документ может по-разному обрабатываться при разных настройках default, format и преобразования типов.
Частые ошибки — смешивать регистрацию с активацией, проверять только соседнюю версию при долгом хранении истории, считать необязательное поле всегда безопасным и применять правила Avro к JSON Schema. Также опасно менять содержимое уже используемой версии и откатывать приложение без проверки новых документов.
Ещё одна ошибка — строить отдельный сервис реестра без потребности в независимом управлении. Если команды выпускаются вместе, достаточно небольшой системы и понятного процесса поставки. Если потребители обновляются независимо, экономия на описании версий быстро оборачивается ручным согласованием и поиском скрытых зависимостей. Решение следует привязать к реальному порядку выпуска.
Итоговый артефакт — карта контрактов и версий, матрица совместимости, план перехода и результаты проверок. Этот пакет позволяет согласовать изменение до включения нового формата. Если переносится история, дополните его планом миграции и сверки данных.
Выберите одно планируемое изменение и проверьте четыре сочетания: старая и новая версии производителя со старой и новой версиями потребителя. Для самого JSON-контракта используйте JSON Schema. Способ хранения оцените отдельно по критериям динамических атрибутов и проверкам JSONB.
Обсудить проект
Если хотите применить этот материал к вашему проекту, напишите нам. Поможем уточнить вводные, риски и следующий шаг: оценку, discovery, разработку, интеграцию или сопровождение.
СвязатьсяПредыдущая
JSONB в PostgreSQLСледующая
Обработка больших данных© 2018–2026, ООО «РоботБулл Технолоджи» ИНН 9710065224
ОКВЭД 62.01
Сведения об ИТ-деятельности