# README
circuitbreaker
Circuit Breaker for web middleware and rpc interceptor.
Example of use
gin circuit breaker middleware
import "github.com/go-dev-frame/sponge/pkg/shield/circuitbreaker"
// CircuitBreaker a circuit breaker middleware
func CircuitBreaker(opts ...CircuitBreakerOption) gin.HandlerFunc {
o := defaultCircuitBreakerOptions()
o.apply(opts...)
return func(c *gin.Context) {
breaker := o.group.Get(c.FullPath()).(circuitbreaker.CircuitBreaker)
if err := breaker.Allow(); err != nil {
// NOTE: when client reject request locally, keep adding counter let the drop ratio higher.
breaker.MarkFailed()
response.Output(c, http.StatusServiceUnavailable, err.Error())
c.Abort()
return
}
c.Next()
code := c.Writer.Status()
// NOTE: need to check internal and service unavailable error, e.g. http.StatusInternalServerError
_, isHit := o.validCodes[code]
if isHit {
breaker.MarkFailed()
} else {
breaker.MarkSuccess()
}
}
}
rpc server circuit breaker interceptor
import "github.com/go-dev-frame/sponge/pkg/shield/circuitbreaker"
// UnaryServerCircuitBreaker server-side unary circuit breaker interceptor
func UnaryServerCircuitBreaker(opts ...CircuitBreakerOption) grpc.UnaryServerInterceptor {
o := defaultCircuitBreakerOptions()
o.apply(opts...)
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
breaker := o.group.Get(info.FullMethod).(circuitbreaker.CircuitBreaker)
if err := breaker.Allow(); err != nil {
// NOTE: when client reject request locally, keep adding let the drop ratio higher.
breaker.MarkFailed()
return nil, errcode.StatusServiceUnavailable.ToRPCErr(err.Error())
}
reply, err := handler(ctx, req)
if err != nil {
// NOTE: need to check internal and service unavailable error
s, ok := status.FromError(err)
_, isHit := o.validCodes[s.Code()]
if ok && isHit {
breaker.MarkFailed()
} else {
breaker.MarkSuccess()
}
}
return reply, err
}
}
# Functions
NewBreaker return a sreBresker with options.
WithBucket set the bucket number in a window duration.
WithRequest with the minimum number of requests allowed.
WithSuccess with the K = 1 / Success value of sre breaker, default success is 0.5 Reducing the K will make adaptive throttling behave more aggressively, Increasing the K will make adaptive throttling behave less aggressively.
WithWindow with the duration size of the statistical window.
# Constants
StateClosed when circuit breaker closed, request allowed, the breaker calc the succeed ratio, if request num greater request setting and ratio lower than the setting ratio, then reset state to open.
StateOpen when circuit breaker open, request not allowed, after sleep some duration, allow one single request for testing the health, if ok then state reset to closed, if not continue the step.
# Variables
ErrNotAllowed error not allowed.
# Interfaces
CircuitBreaker is a circuit breaker.
# Type aliases
Option is sre breaker option function.