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  }