Что необходимо учесть, добавляя автоматические повторы вызова внешнего сервиса?
- Как настроить Retry в Resilience4j?
Повторять только идемпотентное, только временные ошибки (таймаут, 503, 429), с экспоненциальной отсрочкой и джиттером, с лимитом попыток и общего времени. 4xx не повторяют.
- Повторы на каждом уровне цепочки умножаются — делать на одном уровне
- Resilience4j: @Retry с maxAttempts, waitDuration, exponentialBackoffMultiplier, retryExceptions
- Неидемпотентный POST — с ключом идемпотентности
А ещё Retry вместе с circuit breaker — повторы не должны долбить открытый breaker
Подробно
Повтор неидемпотентной операции создаёт второй платёж или второй заказ — поэтому либо операция безопасна по природе, либо её защищает ключ идемпотентности. Джиттер нужен, потому что без него все клиенты, получившие ошибку одновременно, повторят её тоже одновременно и создадут волну, которая не даст сервису подняться. Ограничение общего бюджета времени важнее, чем кажется: три повтора по пять секунд превращают быстрый отказ в пятнадцатисекундное ожидание, а вызывающий к тому времени уже отвалился по своему таймауту. Повторять имеет смысл только то, что может пройти при следующей попытке: сетевые сбои, 5xx, 429 с учётом Retry-After. Ошибки вида 400 или 404 при повторе дадут ровно тот же результат. И обязательно сочетайте повторы с circuit breaker — иначе они превращаются в усилитель нагрузки на уже падающий сервис.
Что хотят услышать
- Условия повтора и какие ошибки повторять.
- Отсрочка, джиттер, лимиты.
- Умножение повторов в цепочке.
Частые ошибки
- Повторять POST без ключа идемпотентности.
- Ставить повторы без джиттера и без общего бюджета времени.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Повторять только идемпотентные операции или защищённые ключом идемпотентности
- ✓Нужна экспоненциальная задержка со случайным разбросом
- ✓Повторы ограничены по числу и общему бюджету времени
- ✗Повторять следует любые ошибки, включая 400 Bad Request, ведь причина может оказаться временной
Что спросят дальше
- Почему повторы без circuit breaker опасны?
- Как учитывать заголовок Retry-After при 429?
Разбор темы
- Resilience: таймауты, ретраи и circuit breaker
Защита от каскадных отказов: таймауты, безопасные ретраи, состояния circuit breaker, bulkhead и rate limiter, fallback и порядок паттернов.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.