github.com/wfusion/gofusion@v1.1.14/common/infra/watermill/message/router/middleware/circuit_breaker.go (about) 1 package middleware 2 3 import ( 4 "github.com/sony/gobreaker" 5 "github.com/wfusion/gofusion/common/infra/watermill/message" 6 ) 7 8 // CircuitBreaker is a middleware that wraps the handler in a circuit breaker. 9 // Based on the configuration, the circuit breaker will fail fast if the handler keeps returning errors. 10 // This is useful for preventing cascading failures. 11 type CircuitBreaker struct { 12 cb *gobreaker.CircuitBreaker 13 } 14 15 // NewCircuitBreaker returns a new CircuitBreaker middleware. 16 // Refer to the gobreaker documentation for the available settings. 17 func NewCircuitBreaker(settings gobreaker.Settings) CircuitBreaker { 18 return CircuitBreaker{ 19 cb: gobreaker.NewCircuitBreaker(settings), 20 } 21 } 22 23 // Middleware returns the CircuitBreaker middleware. 24 func (c CircuitBreaker) Middleware(h message.HandlerFunc) message.HandlerFunc { 25 return func(msg *message.Message) ([]*message.Message, error) { 26 out, err := c.cb.Execute(func() (any, error) { 27 return h(msg) 28 }) 29 30 var result []*message.Message 31 if out != nil { 32 result = out.([]*message.Message) 33 } 34 35 return result, err 36 } 37 }