Гайды

Avro и Schema Registry в Kafka

Схемы Avro, subject и совместимость, wire format, эволюция полей, serializers и альтернативы Protobuf/JSON Schema.

~11 мин чтения

Avro и Schema Registry в Kafka

В Kafka сообщения — байты. Avro даёт компактную бинарную сериализацию и схему, эволюционирующую через правила совместимости. Schema Registry (Confluent или совместимые OSS) хранит схемы по subject и выдаёт id схемы, который кладётся в wire-format записи. Связка с producer/consumer — Kafka Producers, Kafka Consumers.


1. Зачем Avro в Kafka

JSON в UTF-8Avro
Читаемость без схемыНужна схема для десериализации
Больше размер, выше CPUКомпактнее, быстрее
Слабая эволюция полейBackward / forward совместимость по правилам

2. Схема Avro (пример)

json
{
  "type": "record",
  "name": "OrderCreated",
  "namespace": "com.example.events",
  "fields": [
    { "name": "orderId", "type": "string" },
    { "name": "amount", "type": "long" },
    { "name": "currency", "type": ["null", "string"], "default": null }
  ]
}

Union с null и default — типичный способ добавлять поля с backward-совместимостью.


3. Schema Registry: subject и версии

Обычно имена subject'ов:

  • topic-value / topic-key для TopicNameStrategy.
  • Или RecordNameStrategy — по полному имени record.

При публикации новой схемы Registry проверяет совместимость (BACKWARD, FORWARD, FULL, NONE и др.) с предыдущей версией.


4. Wire format

Перед payload идёт magic byte + schema id (4 байта) + Avro binary. Consumer читает id, тянет схему из Registry (с кэшем) и десериализует.

Первый байт обычно 0x0 (Confluent wire format); если в топик попали «голые» Avro-байты без заголовка, десериализатор выдаст мусор — проверяйте, что JSON→Avro миграция не смешала форматы на одном subject.


5. Эволюция схемы

  • Добавить поле с default — обычно backward OK (новый reader, старый writer).
  • Удалить поле — чаще ломает backward; нужны стратегии dual-write или новая major-версия топика.
  • Изменить тип — почти всегда breaking; лучше новое поле + deprecation.

Политику совместимости фиксируйте в Registry и в code review.


6. Producer / Consumer настройки (Kafka Java)

KafkaAvroSerializer / KafkaAvroDeserializer + schema.registry.url.
Deserializer часто требует specific.avro.reader или GenericRecord.


7. Альтернативы

  • Protobuf и JSON Schema — поддерживаются Confluent Schema Registry наряду с Avro.
  • AWS Glue Schema Registry, Apicurio — похожие идеи, другой wire format.

8. Операционные моменты

  • Registry — SPOF, если один инстанс; кластерize (RAFT в Confluent 7.x+).
  • Бэкап subject/version как часть DR.
  • Миграция с «голого JSON» — новый топик или версия + dual consume.

use.latest.version=false (или аналог в вашем клиенте) на время деплоя помогает избежать ситуации, когда producer уже пишет новую схему, а consumer ещё старый код — планируйте двухфазное включение: сначала обновить читателей, потом писателей (или наоборот по правилам совместимости).


9. Чек-лист

  • Subject naming strategy согласована в команде.
  • Уровень совместимости задан и проверяется в CI (регистрация схем).
  • Тесты чтения старыми схемами новых сообщений и наоборот.
  • Мониторинг ошибок десериализации на consumer.

Дальше: Connect и конвертеры · Мониторинг · Тег Kafka