Перейти к содержанию

Шаблон “Повтор”

Повтор (Retry) — это архитектурный паттерн, который позволяет определять стратегию по восстановлению после временных ошибок.
Вот несколько примеров таких ошибок:

  • проблемы с интернет соединением;
  • повышенная нагрузка на внешний компонент/систему.

Как видно, все эти ошибки являются восстанавливаемыми. И в случае их возникновения есть смысл повторить запрос немедленно или через некоторую задержку вместо логирования ошибки и возвращения ошибочного результата.

Чек лист для внедрения

  1. Определите список подходящих ошибок
    Нужно определить после каких ошибок системе необходимо повторять запрос. Например, если произошла timeout-ошибка, то есть смысл повторить запрос заново. В случае, если была ошибка авторизации, то повторное выполнение запроса с теми же данными — бессмысленно.
  2. Определите количество повторных попыток
    Это то количество раз, сколько запрос будет пытаться успешно выполниться. Если этого так и не случится — пользователю будет выдана ошибка.
  3. Определите задержку перед повторной попыткой
    Это то время, через которое будет произведен повторный запрос в случае ошибки, которая попадает под категорию повторного запроса. В случае клиентских систем, которые должны обеспечивать быстрый отклик — задержка должна быть минимально возможной. В случае, если запросы производятся уже без ожидания пользователем результата — задержка должна быть достаточной для того, чтобы система восстановилась.

Зачастую используют одно из трех значений задержки:

  • константное время задержки перед каждым запросом (например, мы определяем задержку в 5 секунд. Получается, в случае ошибки — повторный запрос будет отправлен через 5 секунд и после каждого ошибочного запроса будет задержка в 5 секунд, пока не истечет количество попыток);
  • увеличивающееся время (например, мы устанавливаем первоначальное время задержки в 5 секунд и перед каждой следующей попыткой это время будет линейно или экспоненциально увеличиваться);
  • рандомное время (устанавливаются минимальные и максимальные границы и по определенному алгоритму рассчитывается время задержки перед следующей попыткой).

Алгоритм работы

  1. Отправка запроса от нашего приложения к внешнему сервису;
  2. Если код ответа успешный — закончить обработку запроса и продолжить работу приложения;
  3. В случае, если код ответа не является успешным — сделать задержку на определенное время;
  4. Повторить начиная с п.1 заданное количество раз
  5. В случае, если успешный код ответа так и не был получен — залогировать, обработать ошибку и продолжить работу приложения.

Наиболее популярной библиотекой для реализации Retry-паттерна является Polly.

Ссылки

https://dev.to/abh1navv/retry-pattern-in-microservices-4m39
https://t.me/DotnetBackendStudy/34


Последнее обновление : 21 июня 2023 г.
Дата создания : 9 июля 2022 г.

Комментарии

Комментарии