Что такое Avro схемы?
Что проверяют
Работали ли вы с типизированными данными в потоках и хранилищах или знаете только JSON. Для Java-разработчика за вопросом почти всегда стоит Kafka: как схема доезжает до потребителя и что случится, когда отправитель добавит поле.
Как отвечать
Avro это формат сериализации: данные пишутся компактно в двоичном виде, а их структура описана схемой в JSON с типами record, enum, array, map, union и примитивами. Имён полей в самих данных нет, поэтому прочитать их без схемы невозможно.
Важное уточнение про то, где живёт схема. В файле контейнера она действительно записана в заголовке, один раз на множество записей. В сообщениях брокера так не делают: рядом работает реестр схем, а в сообщении едет только идентификатор версии.
Дальше самое интересное, эволюция схем. При чтении участвуют две схемы: та, которой писали, и та, которую ждёт код. Avro сопоставляет поля по имени и приводит одну к другой. Отсюда правила совместимости: новое поле безопасно, только если у него есть значение по умолчанию; необязательность выражают объединением с null и дефолтом null; переименование делают через alias, а не правкой имени.
Плюсы против JSON: меньше объём, строгая типизация, генерация классов на этапе сборки, проверяемая совместимость версий.
Где спотыкаются
Говорят, что схема всегда едет вместе с данными. Для файлов это верно, для сообщений нет, и без реестра потребитель просто не разберёт байты.
Добавляют поле без значения по умолчанию и ломают старых потребителей. Проверка совместимости в реестре ловит это до релиза, если её включили и выбрали нужный режим.
Переименовывают поле, считая это косметикой. Сопоставление идёт по имени, поэтому без alias старые данные читаться перестанут, а ошибка всплывёт на исторических топиках, а не на свежих.