Как работает автоматический выключатель в состоянии HALF_OPEN (отказоустойчивость 4j)

#circuit-breaker #resilience4j

Вопрос:

Иногда я вижу исключение CallNotPermittedException с сообщением, в котором говорится, что автоматический выключатель находится в состоянии HALF_OPEN. Но я не понимаю, как это работает в таком состоянии. Я написал тест с макетом сервера, где у меня есть permittedNumberOfCallsInHalfOpenState=2, Затем я ставлю в очередь 3 вызова с задержкой (3 секунды) и звоню, следующий вызов завершится ошибкой с исключением CallNotPermittedException и сообщением HALF_OPEN. Но если я подожду 3 секунды (достаточно для завершения вызовов) и сделаю следующий вызов, CB теперь находится в закрытом состоянии. как происходит переход из HALF_OPEN в другое состояние ? это подождет какое-то время? или просто «permittedNumberOfCallsInHalfOpenState», чтобы закончить ? тогда почему я должен сделать 3 звонка, а не 2 ?

Я использую версию 1.5

Комментарии:

1. Ты это читал? resilience4j.readme.io/docs/circuitbreaker

Ответ №1:

Прерыватель цепи отклоняет вызовы с исключением CallNotPermittedException, когда он ОТКРЫТ. По истечении времени ожидания состояние прерывателя цепи изменяется с ОТКРЫТОГО на ПОЛУОТКРЫТОЕ и позволяет настроить количество вызовов, чтобы узнать, по-прежнему ли серверная часть недоступна или снова стала доступной. Дальнейшие вызовы отклоняются с исключением CallNotPermittedException до тех пор, пока не будут завершены все разрешенные вызовы. Если частота сбоев или медленная частота вызовов равна или превышает заданный порог, состояние снова меняется на ОТКРЫТОЕ. Если частота сбоев и медленная частота вызовов ниже порогового значения, состояние снова меняется на ЗАКРЫТОЕ.

Это означает, что если у вас есть 3 одновременных вызова в состоянии HALF_OPEN, два разрешены, а 1 отклонен.

Но если 2 вызова завершаются успешно до выполнения третьего вызова, прерыватель цепи переходит в режим «ЗАКРЫТО» и разрешает третий вызов.