Как устроена Kafka и какие основные абстракции и типы данных используются
Что проверяют
Знаете ли вы базовые сущности и понимаете ли, что сообщение это пара ключ-значение из байтов.
Как отвечать
Абстракции:
- брокер: узел кластера, хранит партиции;
- тема: именованный поток событий;
- партиция: упорядоченный журнал внутри темы, единица параллелизма и порядка;
- смещение: позиция сообщения в партиции;
- продюсер: пишет, выбирая партицию по ключу;
- консьюмер и группа: читают, каждая партиция закреплена за одним потребителем группы;
- реплика: копия партиции на другом брокере, есть лидер и последователи.
Само сообщение это запись из ключа, значения, метки времени и заголовков. И ключ, и значение для Kafka это просто байты: она ничего не знает о формате. Сериализацию задаёт клиент, отсюда key.serializer и value.serializer.
Ключ важен не как данные, а как средство маршрутизации: по его хешу выбирается партиция, поэтому события с одним ключом гарантированно идут по порядку. Ключ null означает равномерное распределение.
Форматы данных на практике: JSON (просто, но многословно и без контроля схемы), Avro и Protobuf вместе с реестром схем (компактно и с проверкой совместимости при изменении полей). Реестр схем стоит назвать отдельно: он не даёт выкатить продюсера, который сломает существующих потребителей.
Полезно упомянуть уплотнение по ключу (log compaction): в такой теме хранится последнее значение для каждого ключа, что превращает её в журнал изменений состояния.
Где спотыкаются
Считают, что Kafka знает формат сообщений.
Не задают ключ там, где нужен порядок.
Не знают про реестр схем и ломают потребителей изменением полей.
Путают уплотнение и удаление по времени хранения.