This package provides the core circuit breaker implementation that can be used in any context (HTTP, gRPC, or custom applications).
Location: trellis.tech/trellis/common.v3/middleware/circuitbreaker
Purpose: Generic circuit breaker implementation
This is the core circuit breaker package. It provides:
CircuitBreaker - Main circuit breaker implementationConfig - Circuit breaker configurationState - Circuit breaker states (Closed, Open, Half-Open)Counts - Statistics trackingimport (
"context"
"time"
"trellis.tech/trellis/common.v3/middleware/circuitbreaker"
)
// Create circuit breaker
cb := circuitbreaker.NewCircuitBreaker(circuitbreaker.Config{
Name: "my-service",
MaxRequests: 1,
Interval: time.Minute,
Timeout: time.Minute,
ReadyToTrip: func(counts circuitbreaker.Counts) bool {
return counts.ConsecutiveFailures >= 5
},
})
// Execute a function with circuit breaker protection
err := cb.Execute(ctx, func() error {
// Your function that might fail
return doSomething()
})
if err != nil {
if err == circuitbreaker.ErrCircuitBreakerOpen {
// Circuit breaker is open, request was rejected
}
// Handle other errors
}
import (
"google.golang.org/grpc"
"trellis.tech/trellis/common.v3/middleware/circuitbreaker"
)
// Create circuit breaker
cb := circuitbreaker.NewCircuitBreaker(circuitbreaker.Config{
Name: "grpc-service",
MaxRequests: 1,
Interval: time.Minute,
Timeout: time.Minute,
ReadyToTrip: func(counts circuitbreaker.Counts) bool {
return counts.ConsecutiveFailures >= 5
},
})
// Add interceptors
server := grpc.NewServer(
grpc.UnaryInterceptor(circuitbreaker.UnaryCircuitBreakerInterceptor(cb)),
grpc.StreamInterceptor(circuitbreaker.StreamCircuitBreakerInterceptor(cb)),
)
Configure circuit breaker programmatically:
import (
"time"
"trellis.tech/trellis/common.v3/middleware/circuitbreaker"
)
cb := circuitbreaker.NewCircuitBreaker(circuitbreaker.Config{
Name: "my-service",
MaxRequests: 1,
Interval: time.Minute,
Timeout: time.Minute,
ReadyToTrip: func(counts circuitbreaker.Counts) bool {
return counts.ConsecutiveFailures >= 5
},
})
The circuit breaker returns specific errors:
ErrCircuitBreakerOpen: Circuit breaker is in Open state, request rejectedErrCircuitBreakerHalfOpen: Circuit breaker is in Half-Open state and max requests reachedYou can monitor the circuit breaker state and statistics:
// Get current state
state := cb.State() // StateClosed, StateOpen, or StateHalfOpen
// Get statistics
counts := cb.Counts()
// counts.Requests, counts.TotalSuccesses, counts.TotalFailures, etc.