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?

    Сообщение может быть обработано повторно, поэтому бизнес-операция должна быть идемпотентной.

новые гайды и свежие вопросы с собесов — первыми в Telegram Смотреть гайды Подписаться