Для чего нужен брокер сообщений Kafka
Что проверяют
Понимаете ли вы, что Kafka это распределённый журнал событий, а не просто очередь, и какие задачи он решает лучше RabbitMQ или прямого HTTP. Следом почти всегда спрашивают про партиции, порядок сообщений и то, как Go-сервис коммитит offset.
Как отвечать
Сначала модель:
- топик и партиции: топик разбит на партиции, каждая это журнал только на дозапись. Сообщения с одним ключом попадают в одну партицию, пока число партиций не меняли. Порядок гарантирован только внутри партиции;
- offset и retention: сообщение не удаляется после чтения, оно живёт по времени или размеру (по умолчанию 7 дней). Каждая группа потребителей помнит свой offset и может перечитать историю;
- consumer group: партиции распределяются между экземплярами сервиса, одну партицию в группе читает ровно один экземпляр;
- надёжность: репликация,
acks=allиmin.insync.replicas. С Kafka 4.0 кластер работает только на KRaft, без ZooKeeper.
Для чего это нужно: развязать микросервисы через события (заказ создан, и его независимо читают склад, уведомления и аналитика), сгладить пики нагрузки, собирать логи, делать CDC через Debezium, пересчитывать данные повторным чтением.
Для Go назовите клиентов: segmentio/kafka-go на чистом Go, IBM/sarama, twmb/franz-go, confluent-kafka-go поверх librdkafka через cgo. Главное правило: offset коммитится после обработки. В kafka-go это FetchMessage, затем CommitMessages, а ReadMessage в группе коммитит сам. Добавьте graceful shutdown через context и идемпотентную обработку: семантика по умолчанию at-least-once, и дубли будут.
Kafka лишний, если нужен запрос-ответ, приоритеты или отложенная доставка: там проще RabbitMQ или обычный вызов.
Где спотыкаются
Говорят, что Kafka гарантирует порядок сообщений. Порядок есть только внутри партиции, поэтому связанные события должны идти с одним ключом.
Обещают exactly-once из коробки. Идемпотентный продюсер и транзакции закрывают запись в Kafka, а побочные эффекты в вашей базе всё равно требуют идемпотентности.
Масштабируют потребителей, не глядя на число партиций, и удивляются, что пятый под при четырёх партициях простаивает.