circuitbreaker: simplify construction of gobreaker and handy_breaker
Peter Bourgon
8 years ago
11 | 11 |
// the wrapped endpoint count against the circuit breaker's error count.
|
12 | 12 |
//
|
13 | 13 |
// See http://godoc.org/github.com/sony/gobreaker for more information.
|
14 | |
func Gobreaker(settings gobreaker.Settings) endpoint.Middleware {
|
15 | |
cb := gobreaker.NewCircuitBreaker(settings)
|
|
14 |
func Gobreaker(cb *gobreaker.CircuitBreaker) endpoint.Middleware {
|
16 | 15 |
return func(next endpoint.Endpoint) endpoint.Endpoint {
|
17 | 16 |
return func(ctx context.Context, request interface{}) (interface{}, error) {
|
18 | 17 |
return cb.Execute(func() (interface{}, error) { return next(ctx, request) })
|
9 | 9 |
|
10 | 10 |
func TestGobreaker(t *testing.T) {
|
11 | 11 |
var (
|
12 | |
breaker = circuitbreaker.Gobreaker(gobreaker.Settings{})
|
|
12 |
breaker = circuitbreaker.Gobreaker(gobreaker.NewCircuitBreaker(gobreaker.Settings{}))
|
13 | 13 |
primeWith = 100
|
14 | 14 |
shouldPass = func(n int) bool { return n <= 5 } // https://github.com/sony/gobreaker/blob/bfa846d/gobreaker.go#L76
|
15 | 15 |
circuitOpenError = "circuit breaker is open"
|
15 | 15 |
//
|
16 | 16 |
// See http://godoc.org/github.com/streadway/handy/breaker for more
|
17 | 17 |
// information.
|
18 | |
func HandyBreaker(failureRatio float64) endpoint.Middleware {
|
19 | |
b := breaker.NewBreaker(failureRatio)
|
|
18 |
func HandyBreaker(cb breaker.Breaker) endpoint.Middleware {
|
20 | 19 |
return func(next endpoint.Endpoint) endpoint.Endpoint {
|
21 | 20 |
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
|
22 | |
if !b.Allow() {
|
|
21 |
if !cb.Allow() {
|
23 | 22 |
return nil, breaker.ErrCircuitOpen
|
24 | 23 |
}
|
25 | 24 |
|
26 | 25 |
defer func(begin time.Time) {
|
27 | 26 |
if err == nil {
|
28 | |
b.Success(time.Since(begin))
|
|
27 |
cb.Success(time.Since(begin))
|
29 | 28 |
} else {
|
30 | |
b.Failure(time.Since(begin))
|
|
29 |
cb.Failure(time.Since(begin))
|
31 | 30 |
}
|
32 | 31 |
}(time.Now())
|
33 | 32 |
|
10 | 10 |
func TestHandyBreaker(t *testing.T) {
|
11 | 11 |
var (
|
12 | 12 |
failureRatio = 0.05
|
13 | |
breaker = circuitbreaker.HandyBreaker(failureRatio)
|
|
13 |
breaker = circuitbreaker.HandyBreaker(handybreaker.NewBreaker(failureRatio))
|
14 | 14 |
primeWith = handybreaker.DefaultMinObservations * 10
|
15 | 15 |
shouldPass = func(n int) bool { return (float64(n) / float64(primeWith+n)) <= failureRatio }
|
16 | 16 |
openCircuitError = handybreaker.ErrCircuitOpen.Error()
|