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

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

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

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

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

А ещё В Spring Kafka — DefaultErrorHandler с addNotRetryableExceptions

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

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

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

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

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