Паттерны повышения отказоустойчивости в архитектуре ПО

Рассмотрим группу шаблонов, предназначенных для повышения надежности программных приложений с микросервисной архитектурой.

Circuit Breaker

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

В вышеописанной ситуации и следует применять шаблон Circuit Breaker -- "Автоматический выключатель". При его использовании микросервис станет запрашивать другой микросервис через прокси-сервер. При этом микросервис подсчитывает число недавних сбоев и на основании этого определяет, следует ли разрешать выполнение последующих вызовов либо надо немедленно возвращать исключение.

Прокси-сервер может находиться в в одном из следующих состояний:

  1. Closed. Осуществляется передача запросов между сервисами, подсчитывается число сбоев. Когда количество сбоев за определенное время превышает пороговое значение, выключатель прокси-сервера переводится в Open-состояние.
  2. Open. Запросы, поступающие от исходного сервиса, немедленно возвращаются с ошибкой. Когда заданный тайм-аут истекает, выключатель переводится в Half-Open-состояние.
  3. Half-Open. Автоматический выключатель пропускает ограниченное число запросов от исходного сервиса, подсчитывая количество успешных запросов. Когда нужное число достигнуто, то выключатель перейдет в Closed-состояние. В обратном случае он вернется в статус Open.

Применение этого шаблона повысит отказоустойчивость и предотвратит каскадные сбои. Однако следует добавить, что его использование потребует тщательной настройки и мониторинга.

Bulkhead

Этот шаблон называется "Переборка". Такое название он получил благодаря переборкам, которые используются в судостроении и служат для защиты корабля от полного затопления при повреждении отдельных его частей. То же самое происходит и в архитектуре программного приложения: переборки позволяют изолировать элементы приложения в пулы. В результате, в случае сбоя одного из них другие продолжат свою работу.

Паттерн дает возможность разделять ресурсы. Это решение гарантирует, что ресурсы, применяемые для вызова одного сервиса, не будут влиять на ресурсы, применяемые для вызова другого сервиса. Ниже вы увидите пример использования отдельного пула соединений для каждого из нижестоящих сервисов:

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

Применение данного паттерна предотвратит каскадные сбои и позволит изолировать критически важные ресурсы. Однако есть и обратная сторона медали, которая связана с возникновением дополнительной сложности и снижением эффективности использования ресурсов.

По материалам блога https://mcs.mail.ru/blog/.