Что такое Kafka и как она работает
Что проверяют
Понимаете ли вы Kafka как распределённый лог, а не как очередь, из которой сообщение забирают и удаляют. Для Go-разработчика вопрос почти всегда продолжается практикой: каким клиентом пользовались, как коммитите офсеты и что будет, если сервис упадёт посреди обработки.
Как отвечать
Kafka это распределённый append-only лог. Сообщение не удаляется после чтения, а хранится по политике retention (по умолчанию 7 дней) или сжимается компакцией по ключу.
- topic и partition: топик делится на партиции, каждая это упорядоченный лог с офсетами. Порядок гарантирован только внутри партиции, поэтому события одной сущности отправляют с одним ключом;
- broker и репликация: партиция хранится на нескольких брокерах, пишет и читает лидер, фолловеры догоняют. Надёжность записи задаётся
acks=allвместе сmin.insync.replicas; - consumer group: партиции делятся между участниками группы, одну партицию читает один консьюмер. Консьюмеров больше, чем партиций, значит лишние простаивают;
- офсеты: группа коммитит позицию в служебный топик
__consumer_offsets. Коммит после обработки даёт at-least-once, поэтому обработчик должен быть идемпотентным; - метаданные: ZooKeeper заменён встроенным KRaft, а в Kafka 4.0 режим с ZooKeeper удалён совсем.
Из Go-экосистемы назовите клиентов: segmentio/kafka-go, IBM/sarama, twmb/franz-go и confluent-kafka-go. Последний работает через cgo поверх librdkafka, а это усложняет кросс-компиляцию. Для kafka-go покажите разницу между ReadMessage с автокоммитом в группе и связкой FetchMessage плюс CommitMessages после успешной обработки.
Где спотыкаются
Обещают exactly-once «из коробки». Транзакции в Kafka есть, но на запись во внешнюю базу они не распространяются, и дубли всё равно гасятся идемпотентностью.
Не знают про партиционер клиента. В kafka-go у Writer по умолчанию RoundRobin, и сообщения с одним ключом разъезжаются по партициям, пока не задан Hash или Murmur2Balancer.
Обрабатывают сообщения в горутинах и коммитят офсет сразу после чтения. При падении сервиса такие сообщения теряются, а параллельная обработка ломает порядок внутри партиции.