gobreaker implements the Circuit Breaker pattern in Go.
go get github.com/sony/gobreaker
The struct CircuitBreaker is a state machine to prevent sending requests that are likely to fail.
The function NewCircuitBreaker creates a new CircuitBreaker.
func NewCircuitBreaker(st Settings) *CircuitBreakerYou can configure CircuitBreaker by the struct Settings:
type Settings struct {
Name string
MaxRequests uint32
Interval time.Duration
Timeout time.Duration
ReadyToTrip func(counts Counts) bool
OnStateChange func(name string, from State, to State)
IsSuccessful func(err error) bool
}-
Nameis the name of theCircuitBreaker. -
MaxRequestsis the maximum number of requests allowed to pass through when theCircuitBreakeris half-open. IfMaxRequestsis 0,CircuitBreakerallows only 1 request. -
Intervalis the cyclic period of the closed state forCircuitBreakerto clear the internalCounts, described later in this section. IfIntervalis 0,CircuitBreakerdoesn't clear the internalCountsduring the closed state. -
Timeoutis the period of the open state, after which the state ofCircuitBreakerbecomes half-open. IfTimeoutis 0, the timeout value ofCircuitBreakeris set to 60 seconds. -
ReadyToTripis called with a copy ofCountswhenever a request fails in the closed state. IfReadyToTripreturns true,CircuitBreakerwill be placed into the open state. IfReadyToTripisnil, defaultReadyToTripis used. DefaultReadyToTripreturns true when the number of consecutive failures is more than 5. -
OnStateChangeis called whenever the state ofCircuitBreakerchanges. -
IsSuccessfulis called with the error returned from a request. IfIsSuccessfulreturns true, the error is counted as a success. Otherwise the error is counted as a failure. IfIsSuccessfulis nil, defaultIsSuccessfulis used, which returns false for all non-nil errors.
The struct Counts holds the numbers of requests and their successes/failures:
type Counts struct {
Requests uint32
TotalSuccesses uint32
TotalFailures uint32
ConsecutiveSuccesses uint32
ConsecutiveFailures uint32
}CircuitBreaker clears the internal Counts either
on the change of the state or at the closed-state intervals.
Counts ignores the results of the requests sent before clearing.
CircuitBreaker can wrap any function to send a request:
func (cb *CircuitBreaker) Execute(req func() (interface{}, error)) (interface{}, error)The method Execute runs the given request if CircuitBreaker accepts it.
Execute returns an error instantly if CircuitBreaker rejects the request.
Otherwise, Execute returns the result of the request.
If a panic occurs in the request, CircuitBreaker handles it as an error
and causes the same panic again.
var cb *breaker.CircuitBreaker
func Get(url string) ([]byte, error) {
body, err := cb.Execute(func() (interface{}, error) {
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return body, nil
})
if err != nil {
return nil, err
}
return body.([]byte), nil
}See example for details.
The MIT License (MIT)
See LICENSE for details.