Kafka / микросервисы: вопросы с ответами
26 разобранных вопросов по теме «Kafka / микросервисы». Каждый — с правильным ответом и пояснением.
- ACK / NACK / DLQ — что это?
ACK: consumer подтверждает обработку. NACK: отказ (retry или DLQ). DLQ (Dead Letter Queue): очередь для «мёртвых» сообщений, которые не удалось обработать после N ретраев.
- В чём разница: At-least-once vs at-most-once vs exactly-once?
В реальности чаще at-least-once + идемпотентность на стороне consumer'а. Kafka с transactional producer + read_committed даёт effectively-once.
- Что нужно знать про Circuit Breaker?
Защита от каскадных сбоев. CLOSED → OPEN (блокирует) → HALF_OPEN (тестовые запросы). Resilience4j + Spring Boot стартер. Конфигурация: failureRateThreshold, waitDurationInOpenState. Fallback: дефолтное значение или кэш.
- Circuit Breaker — зачем?
Защита от каскадных падений. При N ошибках подряд «размыкается» — запросы сразу отклоняются, сервис получает время оправиться.
- Circuit Breaker: три состояния?
CLOSED: всё работает, запросы проходят. При N ошибок (или % ошибок > threshold) → OPEN. OPEN: все запросы блокируются, возвращается fallback. Через waitDuration → HALF_OPEN. HALF_OPEN: пропускает N тестовых запросов; при успехе → CLOSED, при ошибке → OPEN.
- Что нужно знать про Consumer Group?
Каждая партиция — ровно один consumer из группы. Больше партиций → больше параллелизма. Если consumers > partitions — лишние простаивают. Rebalancing при добавлении/падении consumer. Offset хранится на уровне группы (в __consumer_offsets), поэтому после rebalancing чтение продолжается с закоммиченной позиции.
- Idempotency Key — зачем в платежах?
Клиент шлёт повтор — сервер распознаёт по ключу и не выполняет операцию дважды.
- Что такое Idempotent consumer?
Таблица processed_events(event_id UUID PK). INSERT перед обработкой — конфликт → skip. Или upsert по бизнес-ключу (ON CONFLICT DO UPDATE). В транзакции с бизнес-логикой.
- Kafka: partition, offset, consumer group?
Partition — шард топика. Offset — позиция в partition. Consumer group — каждый partition читает один consumer из группы.
- В чём разница: Kafka Streams vs обычный Consumer?
Consumer: ты сам управляешь offset, обработкой, сохранением. Kafka Streams: клиентская библиотека с декларативной обработкой потоков (filter, map, groupBy, aggregate, join). Stateful — использует RocksDB для локального состояния с бэкапом в changelog-топик.
- В чём разница: Kafka vs RabbitMQ: ключевые различия?
Kafka: pull (consumer сам забирает), хранит сообщения (retention), не удаляет после чтения (можно перечитывать), log compaction, высокая пропускная способность, горизонтальное масштабирование партициями. RabbitMQ: push (брокер отправляет), удаляет после ACK, гибкая маршрутизация (exchange/queue).
- Kafka — зачем?
Распределённый лог-ориентированный брокер. Данные хранятся на диске (retention), не удаляются после прочтения. Topic → Partition → Offset. Partition — единица параллелизма. Зачем: асинхронное взаимодействие, развязка сервисов и потоковая обработка.
- В чём разница: Pagination: offset/limit vs cursor-based?
offset/limit: GET /users?offset=20&limit=10. Простой, но медленный на больших данных (БД пропускает offset строк). cursor-based: GET /users?after=abc123&limit=10. Быстрый (индекс по
- Что такое Saga?
Распределённые транзакции через цепочку локальных + компенсирующие действия. Choreography (события, децентрализованно) vs Orchestration (центральный оркестратор). Пример: оплата → списание → бронирование; при сбое шага выполняются компенсирующие действия, семантически отменяющие уже сделанное (зафиксированные локальные транзакции откатить нельзя).
- Что такое Saga-паттерн?
Распределённые транзакции через цепочку локальных + компенсации. Choreography vs Orchestration.
- Spring Kafka: основные компоненты?
KafkaTemplate: отправка сообщений (send). @KafkaListener: получение (метод с @KafkaListener(topics="...")). ConcurrentKafkaListenerContainerFactory: создаёт контейнеры слушателей, настраивает concurrency, error handler, retry.
- ZooKeeper vs KRaft — что изменилось?
Старые версии Kafka: ZooKeeper хранил метаданные (контроллер, брокеры, топики). KRaft (Kafka Raft, с Kafka 3.3+): метаданные хранятся в самом Kafka через Raft-консенсус выделенными controller-нодами. Проще деплой (нет отдельного ZooKeeper-кластера), ZooKeeper полностью удалён, ZAB заменён на Raft.
- Что такое Гарантии доставки?
at-most-once — может потеряться (но не дублируется). at-least-once — может продублироваться, но не теряется (default). exactly-once — idempotent producer + transactional + read_committed на консьюмере. В проде: at-least-once + идемпотентная обработка (upsert в БД).
- Зачем брокеры в банке?
Асинхронные платежи (не блокировать пользователя), уведомления (SMS/push), события между микросервисами (заявка одобрена → выдать кредит → отправить SMS). Kafka: pull, хранит сообщения в логе, чтение по offset, high throughput. RabbitMQ: push, удаляет сообщение после ack. Дают асинхронную (eventual) консистентность и развязку сервисов, но не заменяют транзакционную БД.
- Что такое Идемпотентный consumer?
processed_events(event_id UUID PK). INSERT ON CONFLICT DO NOTHING. В транзакции с бизнес-логикой. Или upsert по бизнес-ключу.
- Как обеспечить сохранность данных в Kafka?
replication.factor=3 (каждая партиция на 3 брокерах). min.insync.replicas=2 (минимум 2 реплики подтверждают). acks=all (producer ждёт подтверждения от всех ISR). unclean.leader.election.enable=false, чтобы отставшая реплика не стала лидером и не потерялись неотреплицированные сообщения.
- Как тестировать Kafka в автотесте?
1) Поднять Kafka через Testcontainers (или EmbeddedKafka). 2) Отправить сообщение KafkaTemplate.send(topic, message). 3) Прочитать ответное через KafkaConsumer.poll(). 4) Проверить содержимое. Testcontainers поднимает реальный брокер и сам управляет портами.
- Монолит vs микросервисы — когда что?
Монолит проще разрабатывать и деплоить, микросервисы — масштабировать независимо и развивать большими командами. Начинайте с монолита.
- В чём разница: Распределённые транзакции: 2PC vs Saga?
2PC — координатор + участники, блокировки, плохо масштабируется. Saga — цепочка локальных транзакций с компенсирующими действиями. Хореография vs оркестрация.
- Что такое микросервис?
Автономный сервис с одной зоной ответственности, собственной БД, независимым деплоем. Общается через REST/gRPC (синхронно) или брокер (асинхронно). Плюсы: независимый деплой, масштабирование, технологическая гибкость.
- Consumer обработал сообщение, но упал до commit offset. Что вероятнее всего произойдёт при at-least-once?
Сообщение может быть обработано повторно, поэтому бизнес-операция должна быть идемпотентной.