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

Что необходимо учесть, добавляя автоматические повторы вызова внешнего сервиса?

MiddleУстойчивость и наблюдаемостьSpring Boot
Ещё спрашивают так:
  • Как настроить Retry в Resilience4j?
Коротко

Повторять только идемпотентное, только временные ошибки (таймаут, 503, 429), с экспоненциальной отсрочкой и джиттером, с лимитом попыток и общего времени. 4xx не повторяют.

  • Повторы на каждом уровне цепочки умножаются — делать на одном уровне
  • Resilience4j: @Retry с maxAttempts, waitDuration, exponentialBackoffMultiplier, retryExceptions
  • Неидемпотентный POST — с ключом идемпотентности

А ещё Retry вместе с circuit breaker — повторы не должны долбить открытый breaker

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

Подробно

Повтор неидемпотентной операции создаёт второй платёж или второй заказ — поэтому либо операция безопасна по природе, либо её защищает ключ идемпотентности. Джиттер нужен, потому что без него все клиенты, получившие ошибку одновременно, повторят её тоже одновременно и создадут волну, которая не даст сервису подняться. Ограничение общего бюджета времени важнее, чем кажется: три повтора по пять секунд превращают быстрый отказ в пятнадцатисекундное ожидание, а вызывающий к тому времени уже отвалился по своему таймауту. Повторять имеет смысл только то, что может пройти при следующей попытке: сетевые сбои, 5xx, 429 с учётом Retry-After. Ошибки вида 400 или 404 при повторе дадут ровно тот же результат. И обязательно сочетайте повторы с circuit breaker — иначе они превращаются в усилитель нагрузки на уже падающий сервис.

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

  • Условия повтора и какие ошибки повторять.
  • Отсрочка, джиттер, лимиты.
  • Умножение повторов в цепочке.

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

  • Повторять POST без ключа идемпотентности.
  • Ставить повторы без джиттера и без общего бюджета времени.

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

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

Показать варианты и ответ
  • ✓Повторять можно только идемпотентные операции либо защищённые ключом идемпотентности
  • ✓Нужна экспоненциальная задержка со случайным разбросом, иначе клиенты синхронизируются и добивают сервис
  • ✓Повторы должны быть ограничены по числу и общему бюджету времени
  • ✗Повторять следует любые ошибки, включая 400 Bad Request

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

  • Почему повторы без circuit breaker опасны?
  • Как учитывать заголовок Retry-After при 429?

Разбор темы

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

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

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

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

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