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

Шаблон “Предохранитель”

Данный паттерн рассчитан на ошибки, исправление которых требует много времени. Например, обрыв соединения, отказ оборудования. В данном случае отправка повторных запросов (паттерн Retry), скорее всего, будет бессмысленна. А если к тому же представить, что к какому-то сервису обращается много клиентов и этот сервис становится недоступным, каждый клиент начинает делать повторные попытки своих запросов к неработающему сервису — существенно увеличивается исходящий трафик от пользователей этого сервиса.

Вместо этого есть смысл реализовать некий защитный барьер, который будет останавливать повторяющиеся запросы, если в них нет смысла. В идеале этот паттерн должен использоваться совместно с Retry-паттерном. Данный паттерн проверяет причину, почему запрос провалился и если эта причина не является временной — запрещает отправлять повторные запросы. Если же ошибка является временной — то в дело вступает Retry-паттерн.

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

Исходное название данного паттерна (circuit breaker) переводится на русский, как “предохранитель”. И в нем существует 3 состояния:

  1. Замкнутое — Все запросы корректно проходят, либо успешно завершаются с помощью Retry-паттерна. Есть определенный лимит ошибочных ситуаций, которые не удается обойти с помощью Retry-паттерна(т.е. либо даже после повторных запросов приходит ошибочный результат, либо код ошибки сразу дает понять о бесполезности повторного запроса). В случае, если данный лимит превышается, то приложение переходит в следующее состояние;
  2. Разомкнутое — В данном состоянии приложение запрещает отправлять какие-либо запросы. При переходе в это состояние запускается таймер. Как только он истекает, приложение переходит в следующее состояние;
  3. Ограниченное — В данном состоянии приложение разрешает отправлять только определенный процент запросов — чтобы сразу не повышать нагрузку до максимума. Если все они завершаются успешно, то считается, что внешний сервис восстановился и приложение переходит в замкнутое состояние. Если же хотя бы один из запросов не проходит, то приложение возвращается в разомкнутое состояние и таймер перезапускается, чтобы дать время внешнему сервису на восстановление.

В качестве реализации также подойдет библиотека Polly

Ссылки

https://microservices.io/patterns/reliability/circuit-breaker.html
https://docs.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker
https://t.me/DotnetBackendStudy/35


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

Комментарии

Комментарии