English translation is not available yet. Showing Russian content.
Настроить message schema registry
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Настроить message schema registry
1. Цель задачи
Научиться проектировать и развёртывать централизованное хранилище версий схем сообщений для многокомпонентной системы, где агенты (микросервисы) обмениваются данными. Создать registry, который автоматически проверяет совместимость новых версий схем с предыдущими и блокирует breaking changes на уровне CI/CD.
Ключевой результат Работающий schema registry + CI-check, который не пропускает обратно несовместимые изменения сообщений.
2. Исходные данные
Перед началом необходимо иметь:
| Что нужно | Откуда взять |
|---|---|
| Микросервис / агенты (2–3) с JSON‑сообщениями | Собственный pet‑проект или учебная система (например, Kafka‑топики) |
| Примеры схем сообщений (JSON Schema или Avro) | Разработать самостоятельно минимум 3–4 схемы (UserCreated, OrderPlaced, PaymentProcessed) |
| CI‑система (GitLab CI / GitHub Actions / Jenkins) | Установленная локально или облачная (GitHub Actions бесплатно) |
| Среда для регистри (Kafka Schema Registry, или самописная на Flask + PostgreSQL) | Docker Compose для локального развёртывания |
| Тестовый репозиторий | Git-репозиторий со схемами (отдельная папка schemas/) |
Если нет реального инструмента — симулируем:
- Вместо Kafka Schema Registry используем самописный Flask‑сервис, который хранит схемы в SQLite и предоставляет API:
POST /schemas— зарегистрировать новую схемуGET /schemas/{name}/versions— список версийGET /schemas/{name}/versions/{version}— получить конкретнуюPOST /compatibility— проверить новую схему против последней
- Для проверки совместимости используем Python‑библиотеки: jsonschema (для JSON Schema) или fastavro (для Avro).
- CI‑шаг: скрипт, который загружает новую схему в registry и проверяет возвращаемый статус.
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Язык | Python 3.10+ | Сервис регистри, CI‑скрипты |
| Веб‑фреймворк | Flask или FastAPI | REST API для registry |
| База данных | SQLite / PostgreSQL | Хранение схем и версий |
| Формат схем | JSON Schema (draft‑07) или Apache Avro | Описание сообщений |
| Проверка совместимости | jsonschema, fastavro или avro | Backward/forward compatibility |
| CI | GitHub Actions / GitLab CI | Автоматическая проверка при PR |
| Контейнеризация (опционально) | Docker + Docker Compose | Лёгкое развёртывание registry |
| Управление версиями | Git | Хранение схем в репозитории |
4. Этапы выполнения
Этап 1: Разработка спецификаций схем (оценка: 30 минут)
Действия
- Придумать 3–4 типа сообщений для системы (например,
UserRegistered,OrderCreated,PaymentApproved). - Для каждого типа создать JSON Schema (файл .schema.json) и поместить в папку
schemas/репозитория.- Первая версия
v1с полями:id, timestamp,data. - Пример UserRegistered/v1.schema.json:
{ "$schema": "https://json-schema.org/draft-07/schema#", "type": "object", "properties": { "userId": {"type": "string"}, "email": {"type": "string", "format": "email"}, "registeredAt": {"type": "string", "format": "date-time"} }, "required": ["userId", "email"] }
- Первая версия
- Для каждой схемы подготовить вторую версию (v2) — совместимую (добавлено опциональное поле
phone) и третью версию (v3) — несовместимую (полеuserIdпереименовано в user_id).
Ожидаемый результат этапа Папка schemas/ с как минимум 3 схемами по 2–3 версии каждая. Примеры: UserRegistered/v1.schema.json, UserRegistered/v2.schema.json, UserRegistered/v3.schema.json (несовместимая).
Этап 2: Создание Schema Registry Service (оценка: 2–3 часа)
Действия
-
Инициализировать Python‑проект (fastapi, uvicorn, sqlalchemy, jsonschema, pydantic).
-
Реализовать модели данных:
- Schema (id, name, version, json_schema, created_at, is_latest)
-
Реализовать REST endpoints:
Метод Endpoint Описание POST /schemasРегистрация новой схемы (тело: { name, version, json_schema })GET /schemas/{name}/versionsСписок всех версий для name GET /schemas/{name}/versions/{version}Получить конкретную схему POST /compatibilityПроверить совместимость (тело: { name, json_schema })GET /healthHealth‑check -
Реализовать логику совместимости:
- Для JSON Schema: backward‑compatible = все поля из предыдущей версии присутствуют в новой (можно добавлять опциональные, нельзя удалять/переименовывать required).
- Проверка:
- Загрузить последнюю зарегистрированную схему.
- Попробовать валидировать пример сообщения, удовлетворяющего предыдущей схеме, против новой — если ошибка, то несовместимо.
- Дополнительно можно сравнивать структуру (список required).
- Принимать параметр
compatibilityType(backward, forward, full); по умолчанию backward.
-
Запустить сервис локально через uvicorn app:app --reload. Протестировать через curl или
httpie.
Ожидаемый результат этапа Работающий REST API registry, способный регистрировать схемы и возвращать совместимость.
Этап 3: CI‑check на совместимость (оценка: 1–2 часа)
Действия
-
Создать в корне репозитория скрипт
ci_validate.py: -
Настроить pipeline в GitHub Actions (файл
.github/workflows/schema-check.yml):name: Schema Compatibility Check on: pull_request: paths: ['schemas/**'] jobs: check: runs-on: ubuntu-latest services: registry: image: python:3.10 ports: ['8000:8000'] options: >- --health-cmd "curl -f http://localhost:8000/health" --health-interval 10s --health-timeout 5s --health-retries 3 steps: - uses: actions/checkout@v3 - name: Start registry run: | pip install -r requirements.txt uvicorn app:app --host 0.0.0.0 --port 8000 & - name: Register existing schemas (optional) run: python ci_bootstrap.py # регистрирует текущие схемы - name: Validate changed schemas run: python ci_validate.py env: REGISTRY_URL: http://localhost:8000 -
Протестировать:
- Создать ветку с несовместимым изменением (v3 схемы) → открыть PR → убедиться, что CI падает.
- Создать ветку с совместимым изменением (добавить optional поле) → PR проходит.
Ожидаемый результат этапа GitHub Actions pipeline, который блокирует PR с breaking changes.
Этап 4: Документация и тестирование (оценка: 1 час)
Действия
- Написать
README.mdс инструкцией:- Как запустить registry локально.
- Как добавить новую схему.
- Как работает CI‑процесс.
- Написать unit‑тесты для сервиса (pytest):
- Тест регистрации.
- Тест backward‑compatible.
- Тест breaking change.
- Тест health.
- Добавить конфигурацию Docker Compose (опционально):
version: '3.8' services: registry: build: . ports: ['8000:8000']
Ожидаемый результат этапа README, unit‑тесты, возможность запустить одной командой docker-compose up.
Этап 5: Интеграционный тест с двумя агентами (оценка: 1 час)
Действия
- Создать два простых симулятора агентов (Python скрипты
agent_a.py,agent_b.py): - При изменении схемы (новый тег) агенты обновляют кешированные схемы.
- Протестировать сценарий: агенты работают со старой схемой, затем registry обновляется с совместимой версией → агенты успешно обрабатывают сообщения. Затем обновление с несовместимой → обработка ломается (можно продемонстрировать fallback).
- Зафиксировать результаты в отчёте.
Ожидаемый результат этапа Работающая демонстрация end‑to‑end с двумя агентами, использующими schema registry.
5. Критерии приемки (Definition of Done)
- Registry запускается локально одной командой (
docker-compose upилиpython app.py). - API регистрирует схемы и возвращает их по имени и версии.
- Эндпоинт
/compatibilityкорректно определяет backward‑совместимость (добавление optional полей — совместимо; удаление required, переименование — несовместимо). - CI‑pipeline (GitHub Actions) выполняет проверку при изменении схем в PR.
- PR с несовместимым изменением помечается как failed и мерж блокируется (либо в GitHub Actions статус fail).
- Написаны минимум 4 unit‑теста (регистрация, совместимость, несовместимость, health).
- README содержит инструкцию по запуску и описание формата схем.
- В репозитории присутствуют как минимум 3 схемы, каждая минимум с 2 версиями (совместимой и несовместимой).
6. Ожидаемый результат
- Артефакт 1 Исходный код Schema Registry (FastAPI/Flask + SQLite) в отдельном репозитории или модуле.
- Артефакт 2 Git‑репозиторий со схемами в папке
schemas/и CI‑конфигурацией.github/workflows/schema-check.yml. - Артефакт 3 Скрипт
ci_validate.pyдля использования в любом CI. - Артефакт 4 README.md с документацией.
- Дополнительно Тестовые симуляторы агентов (
agent_a.py,agent_b.py), демонстрирующие использование registry в runtime.
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| Нет доступа к Kafka Schema Registry | Используем самописный Flask/FastAPI сервис — это даже более учебно |
| Сложность определения совместимости для JSON Schema | Придерживаемся простого правила: backward = не удалены required поля, все новые поля опциональны. Для глубокой проверки можно использовать jsonschema с примером |
| CI не видит registry (сеть в GitHub Actions) | Использовать services: в workflow, который запускает registry как контейнер. Или использовать отдельный endpoint, доступный извне |
| Синхронизация версий схем между ветками | Регистрировать схемы в registry из main только при merge; в PR сравнивать с последней зарегистрированной |
| Обработка большого числа схем и частых изменений | Добавить кэширование (Redis) для GET запросов; версионировать через Git tags |
8. Бюджет времени (оценка)
| Этап | Время |
|---|---|
| Этап 1: Разработка схем | 30 мин |
| Этап 2: Schema Registry | 2–3 ч |
| Этап 3: CI‑check | 1–2 ч |
| Этап 4: Документация и тесты | 1 ч |
| Этап 5: Интеграционный тест | 1 ч |
| Итого | 5,5 – 7,5 ч |
Примечание: Для первого раза время может увеличиться до 10–12 часов из‑за отладки CI и развёртывания.
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 1. Как спроектировать message schema для межсервисного взаимодействия? | Описание сообщений |
| 2. Какие есть стратегии версионирования схем? | Versioning |
| 3. Что такое backward / forward / full compatibility? | Compatibility |
| 4. Как хранить схемы в Git и автоматически проверять? | Git + CI |
| 5. Как реализовать проверку совместимости на Python? | jsonschema |
| 6. Что такое schema registry и зачем он нужен? | Концепция |
| 7. Как интегрировать проверку в CI/CD pipeline? | CI/CD |
| 8. Как обрабатывать ошибки несовместимости в рантайме? | Error handling |
| 9. Как тестировать совместимость схем в юнит‑тестах? | Unit testing |
| 10. Как развернуть schema registry в Docker? | Docker/Compose |
10. Чек-лист самопроверки
- Я создал минимум 3 схемы с разными версиями (совместимые и несовместимые) и поместил их в
schemas/. - Я запустил сервис registry локально и протестировал все endpoints через curl.
- Я написал скрипт
ci_validate.pyи протестировал его локально против registry. - Я настроил GitHub Actions, который запускает проверку при PR в папку
schemas/. - Я создал PR с несовместимым изменением схемы и убедился, что CI падает (статус fail).
- Я убедился, что PR с совместимым изменением проходит успешно.
- Я написал README с инструкцией по запуску и использованию registry.
- Я добавил юнит‑тесты для сервиса и они проходят.
- Я опционально написал Docker Compose и протестировал
docker-compose up. - Я реализовал (хотя бы в тестовом режиме) интеграцию с двумя агентами, чтобы показать end‑to‑end workflow.