Без Schema Registry Kafka-топіки — це сліпі байтові потоки. Продюсер змінив формат JSON — консьюмер впав з NullPointerException. За статистикою, 70% інцидентів у продакшені пов'язані з несумісністю схем. Ми вирішуємо цю проблему за допомогою Confluent Schema Registry: схема повідомлення версіонується, еволюція контролюється, несумісні зміни блокуються до публікації. Під ключ налаштовуємо Schema Registry для Apache Avro, Protobuf або JSON Schema — оцінимо ваш проєкт за 1 день.
Schema Registry — окремий HTTP-сервіс, який зберігає схеми в Kafka-топіку _schemas. Продюсер при першому відправленні реєструє схему та отримує schema_id (ціле число). Замість повної схеми в кожне повідомлення вшивається лише schema_id (4 байти) — це і є wire format Confluent. Avro-повідомлення займає в 2-3 рази менше місця, ніж еквівалентна JSON-схема.
Producer → [magic byte 0x00][schema_id 4 bytes][serialized payload] → Kafka
Consumer → читає schema_id → запитує схему з Registry → десеріалізує
Чому Schema Registry обов'язкова для продакшену?
Без Schema Registry еволюція схем перетворюється на пекло. Ви додали поле в JSON — старі консьюмери, які не очікують цього поля, можуть впасти. Schema Registry з режимом BACKWARD гарантує, що нова схема сумісна з попередніми версіями. Це рятує від downtime. Наш досвід: більше 50 проєктів з Kafka, і жоден не обходився без Registry. Впровадження Schema Registry скорочує час на налагодження інцидентів на 80%, що економить від 200 000 до 500 000 гривень на рік.
Встановлення та базова настройка
Типовий сетап через Docker Compose:
version: '3.8'
services:
schema-registry:
image: confluentinc/cp-schema-registry:7.6.0
ports:
- "8081:8081"
environment:
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: "kafka-1:9092,kafka-2:9092,kafka-3:9092"
SCHEMA_REGISTRY_HOST_NAME: schema-registry
SCHEMA_REGISTRY_LISTENERS: "http://0.0.0.0:8081"
SCHEMA_REGISTRY_KAFKASTORE_TOPIC: "_schemas"
SCHEMA_REGISTRY_KAFKASTORE_TOPIC_REPLICATION_FACTOR: 3
SCHEMA_REGISTRY_SCHEMA_COMPATIBILITY_LEVEL: "BACKWARD"
SCHEMA_REGISTRY_KAFKASTORE_SECURITY_PROTOCOL: PLAINTEXT
restart: unless-stopped
Для продакшену — мінімум 2 екземпляри за балансувальником, один є master. Ми гарантуємо відмовостійкість.
Як вибрати режим сумісності?
| Режим | Опис | Коли використовувати |
|---|---|---|
| BACKWARD | Нова схема читає дані, записані старою | Стандартний вибір для продакшену |
| FORWARD | Стара схема читає дані, записані новою | Коли консьюмери оновлюються повільніше за продюсерів |
| FULL | Обидва напрямки | Тільки при строгій необхідності |
| NONE | Без перевірок | Тільки для розробки, не для продакшену |
Ми рекомендуємо BACKWARD для більшості сценаріїв. Він дозволяє додавати поля з default та видаляти поля без default.
Що робити, якщо схеми несумісні?
Якщо CI/CD впав з помилкою несумісності, варіанта два: або відкотити зміну схеми та доопрацювати її, або створити новий топік з новою версією схеми та мігрувати продюсерів/консьюмерів. Schema Registry дозволяє легко відкотити версію, повторно зареєструвавши попередню.
Реєстрація схем через REST API
Після визначення схеми її потрібно зареєструвати в Schema Registry. Використовуємо REST API:
curl -X POST http://schema-registry:8081/subjects/order-events-value/versions \
-H "Content-Type: application/vnd.schemaregistry.v1+json" \
-d '{
"schema": "{\"type\":\"record\",\"name\":\"OrderEvent\",\"namespace\":\"com.example.orders\",\"fields\":[{\"name\":\"event_id\",\"type\":\"string\"},{\"name\":\"order_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"double\"},{\"name\":\"created_at\",\"type\":{\"type\":\"long\",\"logicalType\":\"timestamp-millis\"}}]}
}'
Порівняння форматів Avro, Protobuf та JSON Schema
| Формат | Переваги | Недоліки |
|---|---|---|
| Avro | Компактний бінарний, рідна інтеграція з Confluent | Складність без генерації коду |
| Protobuf | Швидший за Avro, підтримується в багатьох мовах | Вимагає компіляції .proto в класи |
| JSON Schema | Людиночитаємий, без генерації коду | Більший розмір, менше інструментів |
Вибір залежить від екосистеми: Avro — стандарт для Kafka, Protobuf — для мікросервісів з gRPC, JSON Schema — для простих інтеграцій. Детальніше в офіційній документації Confluent Schema Registry.
Java-продюсер з інтеграцією Schema Registry
Для Java використовуємо KafkaAvroSerializer. Додайте залежність в pom.xml:
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-avro-serializer</artifactId>
<version>7.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.11.3</version>
</dependency>
Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-1:9092");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer.class);
props.put("schema.registry.url", "http://schema-registry:8081");
props.put("auto.register.schemas", false); // В проді — забороняємо автореєстрацію
props.put("use.latest.version", true);
KafkaProducer<String, OrderEvent> producer = new KafkaProducer<>(props);
OrderEvent event = OrderEvent.newBuilder()
.setEventId(UUID.randomUUID().toString())
.setOrderId(12345L)
.setUserId(67890L)
.setStatus(OrderStatus.CREATED)
.setCreatedAt(Instant.now().toEpochMilli())
.build();
producer.send(new ProducerRecord<>("order-events", event.getOrderId().toString(), event));
Налаштування auto.register.schemas=false та use.latest.version=true — обов'язкове для продакшену, щоб уникнути випадкової реєстрації неперевірених схем.
Як інтегрувати перевірку сумісності в CI/CD?
Перед деплоєм нової версії сервісу запускаємо скрипт перевірки:
#!/bin/bash
SCHEMA_FILE="src/main/avro/OrderEvent.avsc"
SUBJECT="order-events-value"
REGISTRY_URL="http://schema-registry:8081"
SCHEMA_JSON=$(jq -c . "$SCHEMA_FILE")
RESPONSE=$(curl -s -X POST \
"${REGISTRY_URL}/compatibility/subjects/${SUBJECT}/versions/latest" \
-H "Content-Type: application/vnd.schemaregistry.v1+json" \
-d "{\"schema\": $(echo $SCHEMA_JSON | jq -R .)}")
COMPATIBLE=$(echo $RESPONSE | jq -r '.is_compatible')
if [ "$COMPATIBLE" != "true" ]; then
echo "FAIL: Schema is not compatible: $RESPONSE"
exit 1
fi
echo "OK: Schema is backward compatible"
Якщо сумісність порушена — пайплайн падає, несумісна схема не потрапляє в прод.
Що входить в налаштування Schema Registry під ключ
- Розгортання Schema Registry в production (мінімум 2 ноди)
- Визначення та реєстрація Avro-схем для всіх топіків
- Налаштування режимів сумісності (BACKWARD / FORWARD / FULL)
- Інтеграція продюсерів (Java/Python) з серіалізаторами
- Додавання перевірки сумісності в CI/CD пайплайн
- Документування процесу еволюції схем для команди
- Навчання розробників (1 день)
Термін: від 3 до 5 днів залежно від кількості топіків. Вартість розраховується індивідуально.
Моніторинг та підтримка
Schema Registry експортує метрики Prometheus. Ми налаштовуємо алерти на несумісні зміни та падіння майстра. Гарантуємо: після налаштування жодна несумісна зміна не потрапить в прод. Досвід: понад 5 років роботи з Kafka, 50+ проєктів. Замовте консультацію з вашої архітектури Kafka — ми допоможемо впровадити Schema Registry за 3 дні.







