Вопрос с собеседования · Брокеры сообщений

Какие ошибки обработки сообщения имеет смысл повторять, а какие нет?

MiddleРетраи, DLQ и идемпотентность
Ещё спрашивают так:
  • Какие ошибки обработки сообщений повторять?
Коротко

Временные сбои (таймаут, недоступность зависимости, блокировка в базе, 503) — повторять с отсрочкой. Постоянные (невалидные данные, ошибка десериализации, нарушение бизнес-правила) — сразу в DLQ.

  • Бесконечный повтор ядовитого сообщения останавливает партицию
  • Ограниченное число попыток с экспоненциальной отсрочкой
  • Классификация исключений: retryable и non-retryable

А ещё В Spring Kafka — DefaultErrorHandler с addNotRetryableExceptions

Подробно

Разделение по природе ошибки — основа всей схемы обработки сбоев. Временный сбой пройдёт при следующей попытке, поэтому повтор с задержкой оправдан. Ошибка в данных воспроизведётся всегда: повторяя её, вы жжёте ресурсы, забиваете логи и, в случае Kafka, останавливаете всю партицию, потому что смещение не двигается. Практическая рекомендация — явно классифицировать исключения в коде обработчика, а не полагаться на общий catch: список повторяемых исключений задаётся осознанно, всё остальное сразу уходит в DLQ. Отдельно стоит помнить, что при повторах обработка обязана быть идемпотентной, иначе успешный побочный эффект выполнится дважды.

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

  • Разделение на временные и постоянные ошибки с примерами.
  • Ограничение повторов и отсрочка.
  • DLQ для постоянных.

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

  • Ловить общее исключение и повторять всё подряд.
  • Не ограничивать число попыток и получить бесконечный цикл.

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

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Временные сбои: недоступность базы, таймаут внешнего сервиса
  • ✓Не повторять ошибки в данных: невалидный формат, нет обязательного поля
  • ✓Постоянные ошибки сразу отправлять в DLQ, не блокируя поток
  • ✗Повторять любые ошибки без ограничений — рано или поздно обработка всё равно пройдёт успешно

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

  • Почему ядовитое сообщение в Kafka блокирует всю партицию?
  • Зачем нужен джиттер в задержке между попытками?

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования