Шаблон “Повтор”¶
Повтор (Retry) — это архитектурный паттерн, который позволяет определять стратегию по восстановлению после временных ошибок.
Вот несколько примеров таких ошибок:
- проблемы с интернет соединением;
- повышенная нагрузка на внешний компонент/систему.
Как видно, все эти ошибки являются восстанавливаемыми. И в случае их возникновения есть смысл повторить запрос немедленно или через некоторую задержку вместо логирования ошибки и возвращения ошибочного результата.
Чек лист для внедрения¶
- Определите список подходящих ошибок
Нужно определить после каких ошибок системе необходимо повторять запрос. Например, если произошла timeout-ошибка, то есть смысл повторить запрос заново. В случае, если была ошибка авторизации, то повторное выполнение запроса с теми же данными — бессмысленно. - Определите количество повторных попыток
Это то количество раз, сколько запрос будет пытаться успешно выполниться. Если этого так и не случится — пользователю будет выдана ошибка. - Определите задержку перед повторной попыткой
Это то время, через которое будет произведен повторный запрос в случае ошибки, которая попадает под категорию повторного запроса. В случае клиентских систем, которые должны обеспечивать быстрый отклик — задержка должна быть минимально возможной. В случае, если запросы производятся уже без ожидания пользователем результата — задержка должна быть достаточной для того, чтобы система восстановилась.
Зачастую используют одно из трех значений задержки:
- константное время задержки перед каждым запросом (например, мы определяем задержку в 5 секунд. Получается, в случае ошибки — повторный запрос будет отправлен через 5 секунд и после каждого ошибочного запроса будет задержка в 5 секунд, пока не истечет количество попыток);
- увеличивающееся время (например, мы устанавливаем первоначальное время задержки в 5 секунд и перед каждой следующей попыткой это время будет линейно или экспоненциально увеличиваться);
- рандомное время (устанавливаются минимальные и максимальные границы и по определенному алгоритму рассчитывается время задержки перед следующей попыткой).
Алгоритм работы¶
- Отправка запроса от нашего приложения к внешнему сервису;
- Если код ответа успешный — закончить обработку запроса и продолжить работу приложения;
- В случае, если код ответа не является успешным — сделать задержку на определенное время;
- Повторить начиная с п.1 заданное количество раз
- В случае, если успешный код ответа так и не был получен — залогировать, обработать ошибку и продолжить работу приложения.
Наиболее популярной библиотекой для реализации Retry-паттерна является Polly.
Ссылки¶
https://dev.to/abh1navv/retry-pattern-in-microservices-4m39
https://t.me/DotnetBackendStudy/34
Последнее обновление :
21 июня 2023 г.
Дата создания : 9 июля 2022 г.
Дата создания : 9 июля 2022 г.