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

Как в Spring Kafka обычно строят retry и dead letter topic?

SeniorSpring KafkaKafka
Ещё спрашивают так:
  • Что такое @RetryableTopic?
Коротко

Два способа: блокирующий — DefaultErrorHandler с BackOff и DeadLetterPublishingRecoverer (повторы на месте, партиция ждёт); неблокирующий — @RetryableTopic: запись уходит в retry-топики с задержкой, а партиция продолжает обрабатываться.

  • Постоянные ошибки (валидация, десериализация) — сразу в DLT без повторов
  • Неблокирующий повтор нарушает порядок для ключа
  • DLT — с заголовками причины, исходного топика и offset

А ещё У DLT должен быть владелец, алерт и способ переиграть сообщения

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

Подробно

Блокирующий повтор:

@Bean
DefaultErrorHandler errorHandler(KafkaTemplate<Object, Object> t) {
    var h = new DefaultErrorHandler(new DeadLetterPublishingRecoverer(t),
                                    new ExponentialBackOff(1000, 2.0) {{ setMaxElapsedTime(30_000); }});
    h.addNotRetryableExceptions(ValidationException.class);
    return h;
}

Запись повторяется на месте; пока идут повторы, остальные записи партиции ждут — порядок сохраняется, но долгая отсрочка задерживает поток. Повторы держат потребителя — нельзя ставить отсрочку длиннее max.poll.interval.ms.

Неблокирующий повтор:

@RetryableTopic(attempts = "4", backoff = @Backoff(delay = 1000, multiplier = 10),
                exclude = ValidationException.class)
@KafkaListener(topics = "payments")
void handle(PaymentEvent e) { ... }

Spring создаёт топики payments-retry-0, -retry-1, … и payments-dlt. Упавшая запись публикуется в retry-топик и будет прочитана после задержки, а основная партиция обрабатывается дальше. Цена — потеря порядка для этого ключа и больше топиков.

Что выбрать: порядок важен (события одной сущности) — блокирующий с небольшим числом попыток; порядок не важен, важна пропускная способность — неблокирующий. В обоих случаях: неповторяемые исключения — сразу в DLT, десериализация — через ErrorHandlingDeserializer, мониторинг DLT.

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

  • Блокирующий и неблокирующий повтор, их компромиссы.
  • DeadLetterPublishingRecoverer и @RetryableTopic.
  • Неповторяемые ошибки и порядок.

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

  • Повторять ошибки валидации.
  • Отсрочка дольше max.poll.interval.ms в блокирующем режиме.

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

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

Показать варианты и ответ
  • ✗Бесконечно повторяют сообщение, пока не получится
  • ✗Удаляют сообщение при первой же ошибке
  • ✗Откатывают offset в начало топика
  • ✓DefaultErrorHandler ретраит с backoff, а после исчерпания попыток публикует запись в DLT через DeadLetterPublishingRecoverer

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

  • Что хранить в DLT headers?
  • Когда retry topic лучше blocking retry?

Разбор темы

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

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

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

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

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