Ответ вслух Middle Надёжность и наблюдаемость спрашивают часто обновлено

Как правильно делать ретраи

Вопрос

Как правильно настроить ретраи при вызове другого сервиса?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Сначала таймаут: без него ретраить нечего, запрос просто висит. Ретраю только то, что может пройти со второго раза: таймауты, 503, 429 с учётом Retry-After, сетевые ошибки.

Что должно прозвучать в ответе

  • Таймаут на каждый вызов обязателен

  • Ретраить только временные ошибки и идемпотентные операции или с ключом идемпотентности

  • Экспоненциальная задержка с jitter

  • Ограничение числа попыток и общий дедлайн запроса

  • Ретраи на одном уровне, плюс circuit breaker

Что могут спросить следом

  • Какие коды ответа ретраить, а какие нет?
  • Что такое retry budget?

Разбор

Сначала таймаут: без него ретраить нечего, запрос просто висит. Ретраю только то, что может пройти со второго раза: таймауты, 503, 429 с учётом Retry-After, сетевые ошибки. 400 и 404 повторять бессмысленно. И только идемпотентные операции или с ключом идемпотентности, иначе дубли. Задержка растёт экспоненциально с jitter, чтобы клиенты не били синхронно. Попыток немного, 2-3, и есть общий дедлайн: если пользователь ждёт 2 секунды, нет смысла в третьей попытке на 1,9 секунде. Ретраи на одном уровне цепочки, иначе они умножаются. И circuit breaker, чтобы не добивать упавший сервис.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.