Какие механизмы сериализации используются в Kafka
Что проверяют
Для системного аналитика это вопрос про контракт сообщения: понимаете ли вы, что Kafka хранит только байты, а формат, схема и правила её изменения лежат на вас и на командах сервисов. Следом обычно спрашивают, как добавить поле в событие, не сломав потребителей.
Как отвечать
Начните с устройства: брокер ничего не знает о структуре данных. Продюсер превращает ключ и значение в байты через key.serializer и value.serializer, консьюмер делает обратное своими десериализаторами. Настройки независимы: ключ может быть строкой, а значение Avro.
Встроенные в клиент Kafka сериализаторы простые: StringSerializer, ByteArraySerializer, IntegerSerializer, LongSerializer, UUIDSerializer и ещё несколько. Для структурированных событий берут форматы со схемой:
- JSON: читается глазами и прост в отладке, но тяжелее по объёму и без схемы не ловит опечатки в полях. Контракт описывают JSON Schema;
- Avro: компактный бинарный формат, схема обязательна. Поле добавляется без поломки, если у него есть значение по умолчанию;
- Protobuf: бинарный, поля идентифицируются номерами. Номер удалённого поля нельзя переиспользовать, его помечают
reserved.
Для Avro и Protobuf почти всегда нужен Schema Registry: сериализатор регистрирует схему, а в сообщение кладёт только её идентификатор. Реестр проверяет режим совместимости: BACKWARD (новые потребители читают старые данные), FORWARD, FULL или NONE.
В спецификации аналитик фиксирует формат, схему со смыслом каждого поля, содержимое ключа (от него зависят партиция и порядок событий одной сущности), режим совместимости и заголовки вроде идентификатора трассировки.
Где спотыкаются
Говорят, что Avro «сжимает данные». Он компактно кодирует, а сжатие настраивается отдельно на продюсере через compression.type.
Переименовывают поле или меняют его тип и считают, что потребители «подстроятся». Реестр с проверкой совместимости такую схему не примет, а без реестра консьюмеры начнут падать на десериализации.
Не описывают ключ сообщения. Без ключа события одного заказа разъезжаются по разным партициям и приходят потребителю не в том порядке.