Получить доступ

Что важно задавать при отправке через KafkaTemplate?

MiddleSpring KafkaKafkaSpring Boot >=3
Ещё спрашивают так:
  • Как надёжно отправлять сообщения через KafkaTemplate?
Коротко

Задавать ключ (порядок и партиция по сущности), сериализатор и формат, обрабатывать результат отправки — она асинхронная; для надёжности — acks=all и идемпотентный продюсер (по умолчанию с Kafka 3).

  • send(topic, key, value) возвращает CompletableFuture (Spring Kafka 3) — ошибку видно только в нём
  • Отправка в той же транзакции с базой не атомарна — outbox или транзакции Kafka
  • Заголовки: тип события, версия схемы, trace id

А ещё Для сквозной трассировки — observation-enabled у шаблона

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Ключ. kafkaTemplate.send("orders", order.id().toString(), event) — все события заказа попадут в одну партицию и будут обработаны по порядку. Без ключа порядок не гарантирован.

Асинхронность. send сразу возвращает CompletableFuture<SendResult> (в Spring Kafka 3; раньше — ListenableFuture). Если ошибку не обработать, сообщение может потеряться незаметно: логировать в whenComplete, при необходимости повторять или сохранять в outbox. Синхронный .get() с таймаутом — когда нужно гарантировать отправку до ответа клиенту.

Надёжность продюсера (spring.kafka.producer.*): acks=all, enable.idempotence=true (по умолчанию с Kafka 3.0), retries и delivery.timeout.ms, на топике min.insync.replicas=2.

Сериализация: JsonSerializer (с заголовком типа) или Avro/Protobuf со Schema Registry для контрактов между командами.

Согласованность с базой: сохранить заказ в базе и отправить событие — две разные системы. Если упасть между ними, событие потеряется или уйдёт без записи в базе. Решения — transactional outbox (событие в таблицу в той же транзакции, публикация отдельным процессом) или CDC. Транзакции Kafka (transactional.id) делают атомарной отправку в несколько топиков и коммит offset, но не запись в базу.

Что хотят услышать

  • Ключ сообщения и порядок.
  • Асинхронный результат и обработка ошибок.
  • Настройки надёжности.
  • Проблема двойной записи и outbox.

Частые ошибки

  • Игнорировать результат send.
  • Отправлять событие из @Transactional-метода и считать это атомарным.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Только текст сообщения, ничего больше
  • ✗Обязательно номер партиции вручную для каждого сообщения
  • ✓Key (партиционирование и порядок событий одной сущности), topic, а также headers/correlation id
  • ✗Пароль брокера в каждом сообщении

Что спросят дальше

  • Как KafkaTemplate сообщает об ошибке отправки?
  • Когда нужен transactional KafkaTemplate?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем