Схема проектирования автоматического выключателя
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
Автоматический выключатель — это шаблон проектирования, используемый при разработке программного обеспечения . Он используется для обнаружения сбоев и воплощает в себе логику предотвращения постоянного повторения сбоя во время обслуживания, временного сбоя внешней системы или непредвиденных системных проблем. Схема автоматического выключателя предотвращает каскадные сбои, особенно в распределенных системах . [1]
Шаблон автоматического выключателя следует использовать вместе с другими шаблонами, такими как повтор, откат и шаблон тайм-аута. Это помогает системе быть более отказоустойчивой . [2]
Обычное использование
[ редактировать ]Предположим, что приложение подключается к базе данных 100 раз в секунду, и база данных выходит из строя. Разработчик приложения не хочет, чтобы одна и та же ошибка повторялась постоянно. Они также хотят быстро и корректно обработать ошибку, не дожидаясь истечения времени ожидания TCP-соединения .
Обычно автоматический выключатель можно использовать для проверки доступности внешней службы. Внешняя служба может быть сервером базы данных или веб-службой, используемой приложением.
Автоматический выключатель обнаруживает сбои и не позволяет приложению попытаться выполнить действие, которое обречено на неудачу (до тех пор, пока не будет безопасно повторить попытку).
Выполнение
[ редактировать ]Реализации шаблона проектирования автоматического выключателя должны сохранять состояние соединения в течение серии запросов. Он должен разгрузить логику обнаружения сбоев в реальных запросах. Следовательно, конечный автомат внутри автоматического выключателя должен работать в некотором смысле одновременно с проходящими через него запросами. Один из способов достижения этого — асинхронно .
На многоузловом (кластерном) сервере состояние восходящей службы должно отражаться на всех узлах кластера. Поэтому реализациям может потребоваться использовать постоянный уровень хранения, например, сетевой кеш, такой как Memcached или Redis , или локальный кеш (на диске или в памяти) для записи доступности того, что для приложения является внешней службой.
Автоматический выключатель записывает состояние внешней службы в заданный интервал.
Прежде чем использовать внешнюю службу из приложения, уровень хранения запрашивается для получения текущего состояния.
Влияние на производительность
[ редактировать ]Хотя можно с уверенностью сказать, что преимущества перевешивают последствия, внедрение Circuit Breaker отрицательно повлияет на объем памяти, сложность приложения и вычислительные затраты выполняющегося приложения. Это связано с тем, что он добавляет дополнительный код в путь выполнения для проверки состояния схемы. Это можно увидеть в приведенном ниже примере PHP, где проверка состояния базы данных APC требует нескольких дополнительных циклов. Кроме того, запуск кода автоматического выключателя сам по себе потребляет ресурсы системы, в которой он работает, в результате чего остается меньше мощности для выполнения «реальных» приложений. [ почему? ]
Насколько это зависит от используемого уровня хранения и общедоступных ресурсов. Наиболее важными факторами в этом отношении являются тип кэша, например, дисковый или кэш-память, локальный или сетевой.
Различные состояния автоматического выключателя
[ редактировать ]- Закрыто
- Открыть
- Полуоткрытый
Закрытое состояние
[ редактировать ]Когда все в порядке, автоматические выключатели остаются включенными, и все запросы передаются службам, как показано ниже. Если количество отказов превышает пороговое значение, автоматический выключатель срабатывает и переходит в разомкнутое состояние.
Открытое состояние
[ редактировать ]В этом состоянии автоматический выключатель немедленно возвращает ошибку, даже не вызывая службы. По истечении времени ожидания автоматические выключатели переходят в полуразомкнутое состояние. Обычно у него есть система мониторинга, в которой указывается время ожидания.
Полуоткрытое состояние
[ редактировать ]В этом состоянии автоматический выключатель пропускает ограниченное количество запросов от микросервиса и вызывает операцию. Если запросы успешны, то автоматический выключатель перейдет во включенное состояние. Однако, если запросы по-прежнему терпят неудачу, он возвращается в состояние «Открыто».
Пример реализации
[ редактировать ]PHP
[ редактировать ]Ниже приведен пример реализации на PHP. Доказательство концепции сохраняет статус сервера MySQL в кэше общей памяти (кэш пользователя APC).
Проверять
[ редактировать ]Следующий скрипт можно запускать через заданный интервал через crontab .
$mysqli = new mysqli("localhost", "username", "password");
if ($mysqli->connect_error) {
apcu_add("dbStatus", "down");
} else {
apcu_add("dbStatus", "up");
$mysqli->close();
}
Использование в приложении
[ редактировать ]if (apcu_fetch("dbStatus") === "down") {
echo "The database server is currently not available. Please try again in a minute.";
exit;
}
$mysqli = new mysqli("localhost", "username", "password", "database");
$result = $mysqli->query("SELECT * FROM table");
Ссылки
[ редактировать ]- ^ Машинное обучение в микросервисах. Создание микросервисной архитектуры для решений машинного обучения . Пакт Паблишинг. 2023. ISBN 9781804612149 .
- ^ Нативные микросервисы Kubernetes с Quarkus и MicroProfile . Мэннинг. 2022. ISBN 9781638357155 .
Внешние ссылки
[ редактировать ]- Пример реализации PHP с диаграммами
- Пример шаблона повтора с Polly с использованием C#
- Пример реализации C# от Андерса Любекерса с использованием Polly
- Пакет Полли NuGet
- Пример реализации на C# от Александра Никитина
- Реализация на Python
- Шаблоны стабильности, применяемые в архитектуре RESTful
- Martin Fowler Bliki