Гайды
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-8 | Avro |
|---|---|
| Читаемость без схемы | Нужна схема для десериализации |
| Больше размер, выше CPU | Компактнее, быстрее |
| Слабая эволюция полей | Backward / forward совместимость по правилам |
2. Схема Avro (пример)
{
"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