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