From c3699e7c11d927439407ecc303ecad0ab5ad6ed1 Mon Sep 17 00:00:00 2001 From: Edward Date: Fri, 22 May 2020 18:39:31 +0800 Subject: [PATCH] add a state check --- resiliency/06_circuit_breaker/README.md | 2 +- ...cuit_breaker.go => circuit_breaker_adv.go} | 26 ++++++++++++++++--- ...osure.go => circuit_func_closure_basic.go} | 0 3 files changed, 23 insertions(+), 5 deletions(-) rename resiliency/06_circuit_breaker/{circuit_breaker.go => circuit_breaker_adv.go} (85%) rename resiliency/06_circuit_breaker/{circuit_func_closure.go => circuit_func_closure_basic.go} (100%) diff --git a/resiliency/06_circuit_breaker/README.md b/resiliency/06_circuit_breaker/README.md index cb80807..9b9ff6d 100644 --- a/resiliency/06_circuit_breaker/README.md +++ b/resiliency/06_circuit_breaker/README.md @@ -20,7 +20,7 @@ Circuit Breaker Pattern 也叫断路器模式,断路器设计模式是故障 ## Circuit Breaker 断路器 -如果电路连续故障超过指定的阈值,它将返回一个快速错误,一段时间后,它会重试请求并记录它。 +电路连续故障,并且超过指定的阈值,它将返回一个快速错误,一段时间后,才会重试请求。 ## Context diff --git a/resiliency/06_circuit_breaker/circuit_breaker.go b/resiliency/06_circuit_breaker/circuit_breaker_adv.go similarity index 85% rename from resiliency/06_circuit_breaker/circuit_breaker.go rename to resiliency/06_circuit_breaker/circuit_breaker_adv.go index 47a6395..15e9acd 100644 --- a/resiliency/06_circuit_breaker/circuit_breaker.go +++ b/resiliency/06_circuit_breaker/circuit_breaker_adv.go @@ -10,11 +10,10 @@ package circuit import ( "context" - "context - "erros" + "errors" "fmt" "sync" - time" + "time" ) //////////////////////////////// @@ -87,10 +86,29 @@ func (rb *RequestBreaker) Do(work func(ctx context.Context) (interface{}, error) rb.mutex.Lock() //handle status of Open to HalfOpen if rb.state == StateOpen && rb.options.Expiry.Before(time.Now()) { - + rb.state = StateHalfOpen + rb.cnter.Reset() + rb.options.OnStateChanged(rb.options.Name, StateOpen, StateHalfOpen) } rb.mutex.Unlock() + switch rb.state { + case StateOpen: + return nil, ErrTooManyRequests + case StateHalfOpen: + //do work from requested user + result, err := work(rb.options.Ctx) + if err != nil { + rb.cnter.Count(FailureState) + + } else { + rb.cnter.Count(SuccessState) + return result, nil + } + + case StateClosed: + } + //do work from requested user result, err := work(rb.options.Ctx) diff --git a/resiliency/06_circuit_breaker/circuit_func_closure.go b/resiliency/06_circuit_breaker/circuit_func_closure_basic.go similarity index 100% rename from resiliency/06_circuit_breaker/circuit_func_closure.go rename to resiliency/06_circuit_breaker/circuit_func_closure_basic.go