Как реализовывался retry механизм при обращении к внешним сервисам
Что проверяют
Был ли у вас реальный опыт или вы пересказываете документацию. По деталям это видно сразу: какие ошибки вы повторяли, какие нет и что делали с неидемпотентными вызовами. Следом почти всегда спрашивают, как ретраи уживались с таймаутами и circuit breaker.
Как отвечать
Стройте ответ вокруг своего случая, а не вокруг аннотации:
- контекст: какой сервис (платёжный шлюз, доставка, API соседней команды), какие сбои были и как вы поняли, что нужны повторы. Цифры только свои: доля ошибок, время ответа, число инцидентов;
- что повторять: таймауты, обрывы соединения,
503,429с учётомRetry-After. Ошибки400,401,404и бизнес-отказы не повторяются; - идемпотентность:
GETповторять безопасно,POSTна создание платежа только с ключом идемпотентности, который проверяет сервер; - задержки: экспоненциальный backoff с jitter, лимит попыток и общий бюджет времени, чтобы повторы не пережили таймаут входящего запроса;
- инструмент: Resilience4j (
Retryвместе сCircuitBreakerиTimeLimiter), Spring Retry (@Retryable,@Recover,RetryTemplate), в реактивном кодеretryWhen(Retry.backoff(...))из Reactor. В Spring Retry нужен@EnableRetry, и работает он через прокси: вызов метода из того же класса повтор не запустит. В новых версиях Spring Framework@RetryableиRetryTemplateесть прямо в ядре; - наблюдаемость: метрики попыток через Micrometer, номер попытки в логах, алерт на рост повторов.
Если опыта не было, так и скажите и разберите, как бы вы сделали: где стоит повтор, какие ошибки в него попадают и почему. Это сильнее придуманной истории, которая развалится на втором уточнении.
Где спотыкаются
Повторяют всё подряд, включая неидемпотентные запросы. Клиенту дважды списываются деньги, а в ответе звучит только «у нас был maxAttempts = 3».
Ставят ретраи на каждом уровне цепочки. Три уровня по три попытки дают до 27 запросов в упавший сервис и добивают его окончательно.
Называют красивый процент роста стабильности, но не могут объяснить, как его считали. Цифры нужны свои и такие, которые вы готовы защитить.