Что важно задавать при отправке через KafkaTemplate?
- Как надёжно отправлять сообщения через KafkaTemplate?
Задавать ключ (порядок и партиция по сущности), сериализатор и формат, обрабатывать результат отправки — она асинхронная; для надёжности — acks=all и идемпотентный продюсер (по умолчанию с Kafka 3).
send(topic, key, value)возвращает CompletableFuture (Spring Kafka 3) — ошибку видно только в нём- Отправка в той же транзакции с базой не атомарна — outbox или транзакции Kafka
- Заголовки: тип события, версия схемы, trace id
А ещё Для сквозной трассировки — observation-enabled у шаблона
Подробно
Ключ. 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 — от него зависят партиция и порядок событий сущности
- ✗Номер партиции вручную для каждого сообщения, иначе порядок не гарантирован
- ✗Пароль брокера в каждом сообщении
Что спросят дальше
- Как KafkaTemplate сообщает об ошибке отправки?
- Когда нужен transactional KafkaTemplate?
Разбор темы
- Spring Kafka
KafkaTemplate, @KafkaListener, listener containers, offset ack, error handling, retries и DLT.
Связанные вопросы
- Как Kafka producer выбирает партицию для сообщения? Middle
- Что означают acks=0, acks=1 и acks=all у Kafka producer? Senior
- Что даёт идемпотентный Kafka producer (enable.idempotence=true)? Senior
- Почему для надёжной публикации события после изменения данных применяют transactional outbox, а не двухфазный коммит? Senior
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.