Как настроить Kafka и взаимодействовать с топиками и идентификаторами
Что проверяют
Понимаете ли вы модель Kafka: топик, партиции, ключ сообщения, группа консьюмеров, оффсеты. Команды установки вторичны. Следом обычно спрашивают, как гарантируется порядок сообщений и что будет, если консьюмеров больше, чем партиций.
Как отвечать
Начните с того, что с Kafka 4.0 ZooKeeper больше не нужен: кластер работает в режиме KRaft, где метаданные хранят сами контроллеры. Локально проще всего поднять официальный образ apache/kafka в Docker. Вручную хранилище сначала форматируют утилитой kafka-storage.sh с идентификатором кластера, потом запускают брокер.
Топик создаётся через kafka-topics.sh --create с числом партиций и фактором репликации. В проде обычно фактор 3 и min.insync.replicas=2. В Spring-проекте топик можно объявить бином NewTopic, и KafkaAdmin создаст его при старте.
Под «идентификаторами» стоит разобрать несколько разных вещей:
- ключ сообщения: по хэшу ключа продюсер выбирает партицию. Сообщения с одним ключом, например
orderId, попадают в одну партицию, и только внутри неё порядок гарантирован; group.id: консьюмеры с однимgroup.idделят партиции топика между собой, разные группы читают поток независимо;- оффсет: позиция чтения в партиции, которую группа коммитит. Автокоммит включён по умолчанию, для надёжной обработки его выключают и коммитят после обработки;
transactional.id: нужен продюсеру для транзакций и семантики exactly-once.
На Java это KafkaProducer и KafkaConsumer из kafka-clients или KafkaTemplate и @KafkaListener в Spring Kafka. У продюсера в современных версиях по умолчанию acks=all и включена идемпотентность.
Где спотыкаются
Рассказывают установку через ZooKeeper как текущую. В версиях 4.x такого режима нет, и ответ выглядит списанным со старой статьи.
Обещают глобальный порядок сообщений в топике. Kafka упорядочивает только внутри партиции, для порядка по сущности нужен правильный ключ.
Добавляют консьюмеров в группу для ускорения, не глядя на число партиций. Консьюмеры сверх числа партиций просто простаивают.