Устойчивость4j

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

В его реализации используется паттерн декоратора и концепции функционального программирования.

Он содержит различные основные части для создания этой гибкой структуры;

  • Автоматический выключатель
  • Повторная попытка
  • TimeLimiter
  • RateLimiter
  • Переборка

Автоматический выключатель

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

Для наблюдения за этим показателем используется раздвижное окно, которое имеет два типа;

  • Основано на подсчете : Последние N вызовов рассматриваются, а их выходы собираются в круговой массив размера N. Если задержка или коэффициент ошибок в этих вызовах превышает пороговое значение, цепь отключается.
  • По времени Создает круговой массив размера N для вывода звонков, полученных за последние N секунд. Каждый индекс соответствует интервалу в одну секунду. В каждом индексе хранятся 3 отдельных целых числа, обозначающих неправильные, отложенные и общие вызовы. В соответствии с соотношением этих значений принимается решение о прерывании цепи.

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

  • порог частоты отказов : Это пороговое значение интенсивности отказов, по умолчанию оно равно 50%.
  • slowCallRateThreshold : Это пороговое значение скорости задержки, по умолчанию — 100%. Принятие вызова как задержки (медленный вызов) также зависит от значения slowCallDurationThreshold. По умолчанию вызов, длящийся более 60000 мс, считается отложенным.

Еще один важный момент, касающийся этих пороговых значений, заключается в том, что они включаются в управление только после того, как общее количество запросов превысит значение minimumNumberOfCalls. Например, когда это значение равно 10, даже если все 9 входящих запросов неисправны, цепь не прерывается, поскольку значение MinimumNumberOfCalls еще не превышено.

Штаты округа

Существует 3 различных состояния, в которых может находиться схема;

  • ЗАКРЫТО Это состояние, при котором цепь не прерывается и все продолжается в обычном режиме.
  • ОТКРЫТО Это состояние системы, когда превышены пороговые значения коэффициентов ошибок или задержек. В этом состоянии входящие запросы отклоняются с ошибкой CallNotPermittedException.
  • ПОЛУОТКРЫТЫЙ : Это промежуточное состояние замкнутой цепи, после ожидания времени, указанного параметром waitDurationInOpenState, вместо прямого перехода в состояние CLOSED. В этом состоянии ему разрешено принимать количество запросов, заданное параметром permittedNumberOfCallsInHalfOpenState. Если частота ошибок или задержек в этих запросах выше пороговых значений, то снова переходит в состояние ОТКРЫТО, если нет, то в состояние ЗАКРЫТО. Для автоматического перехода в это состояние значение параметра automaticTransitionFromOpenToHalfOpenEnabled должно быть установлено в true.

По умолчанию все типы исключений считаются ошибками. Однако вместо этого подхода мы можем внести свои коррективы;

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

Повторная попытка

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

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

Мы можем настроить различные значения при использовании Retry;

  • maxAttempts: Указывает максимальное количество попыток в случае ошибки.
  • waitDuration: Определяет фиксированное время между каждой попыткой.
  • enableExponentialBackoff: указывает, что время, прошедшее между попытками, не будет фиксированным, а будет увеличиваться экспоненциально. Например, время, прошедшее между испытаниями, увеличивается как 2-4-8

Условия повтора могут быть установлены по желанию.

  • Если ответ возвращается, значение resultPredicate, которое будет добавлено в конфигурационный файл, может быть использовано для задания условия, при котором будет произведена повторная попытка.

resultPredicate: io.reflectoring.resilience4j.springboot.predicates.ConditionalRetryPredicate

ConditionalRetryPredicate implements Predicate<SearchResponse> {
 @Override
 public boolean test(SearchResponse searchResponse) {
   if (searchResponse.getErrorCode() != null) {
     return searchResponse.getErrorCode().equals("FS-167");
   } 
   return false;
 }
}
  • Если во время запроса произошла ошибка, retryExceptionPredicate может быть использован для изучения ошибки и принятия решения о повторной попытке или нет, или может быть отфильтрован непосредственно классом с помощью значений retryExceptions и ignoreExceptions.

retryExceptionPredicate: io.github.resilience4j.circuitbreaker.RecordFailurePredicate

public class RecordFailurePredicate implements Predicate<Throwable> {

   @Override
   public boolean test(Throwable throwable) {
       return throwable instanceof IOException || throwable instanceof IgnoredException;
   }
}

Ограничитель времени

TimeLimiter используется для определения максимального количества времени, которое займет операция к данной конечной точке.

  • TimeLimiter может быть применен только к асинхронным конечным точкам (обеспечивается с помощью CompletableFuture).

Мы можем настроить различные значения при использовании TimeLimiter;

  • timeoutDuration: Указывает период тайм-аута входящего запроса.
  • cancelRunningFuture: Указывает, можно ли отменить текущее будущее.

Ограничитель скорости

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

Мы можем настроить различные значения при использовании Rate Limiter;

  • limitForPeriod: Максимальное количество запросов, разрешенное за указанный период
  • limitRefreshPeriod: Указывает период, в течение которого будет действовать заданное значение лимита. В конце периода количество запросов обнуляется.
  • timeoutDuration: Указывает, сколько секунд ждать заблокированному потоку при достижении предельного значения.

Переборка

С помощью Bulkhead мы можем ограничить количество одновременных вызовов.

Она может быть реализована двумя способами;

  • SemaphoreBulkhead : Выполнение входящих запросов с логикой блокировки с помощью семафора.
  • FixedThreadPoolBulkhead : Для каждого входящего запроса из созданного пула потоков берется подходящий поток, и операции выполняются изолированно.

Для семафорного подхода можно настроить два значения;

  • maxConcurrentCalls: Определяет максимальное количество запросов, которые могут быть выполнены одновременно на Bulkhead.
  • maxWaitDuration: Указывает, как долго блокировать запрос, который вызывает превышение указанного количества maxConcurrentCalls.

Для подхода к пулу потоков можно настроить различные значения;

  • coreThreadPoolSize : Указывает фиксированный (минимальный) размер потока для создаваемого пула.
  • maxThreadPoolSize : определяет максимальное количество новых потоков, которые могут быть созданы временно, когда требуется больше потоков, чем coreThreadPoolSize.
  • очередьВместимость : Определяет емкость очереди для хранения входящих запросов при отсутствии свободных потоков в пуле потоков.
  • keepAliveDuration : Определяет, как долго временно созданные потоки могут простаивать. По истечении этого времени поток прерывается.

Оцените статью
devanswers.ru
Добавить комментарий