pub trait Breaker: Send + Sync {
// Required methods
fn is_available(&self, backend: &str) -> bool;
fn record_success(&self, backend: &str);
fn record_failure(&self, backend: &str);
}Expand description
Object-safe interface implemented by both Mutex<CircuitBreaker> and
RedisCircuitBreaker, so a consumer like
crate::proxy::ReverseProxy::with_circuit_breaker can accept either
breaker kind through one Arc<dyn Breaker> without a generic parameter
leaking into its own type.
RedisCircuitBreaker’s Err (Redis unreachable) is treated as available
— failing open, not closed. A breaker that can’t be reached is a worse
single point of failure than occasionally skipping the check it exists to
perform; callers who need fail-closed semantics should call
RedisCircuitBreaker::is_available directly and decide for themselves, as
its own docs already describe.
Required Methods§
Sourcefn is_available(&self, backend: &str) -> bool
fn is_available(&self, backend: &str) -> bool
Returns true if a request should be forwarded to backend.
Sourcefn record_success(&self, backend: &str)
fn record_success(&self, backend: &str)
Record a successful response for backend.
Sourcefn record_failure(&self, backend: &str)
fn record_failure(&self, backend: &str)
Record a failed response for backend.
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".
Implementations on Foreign Types§
Source§impl Breaker for Mutex<CircuitBreaker>
impl Breaker for Mutex<CircuitBreaker>
fn is_available(&self, backend: &str) -> bool
fn record_success(&self, backend: &str)
fn record_failure(&self, backend: &str)
Source§impl<T: Breaker + ?Sized> Breaker for &T
Lets circuit_breaker::global() (which returns &'static Mutex<CircuitBreaker>,
not an owned Mutex<CircuitBreaker>) be used directly as a Breaker:
Arc::new(circuit_breaker::global()) then coerces to Arc<dyn Breaker>.
impl<T: Breaker + ?Sized> Breaker for &T
Lets circuit_breaker::global() (which returns &'static Mutex<CircuitBreaker>,
not an owned Mutex<CircuitBreaker>) be used directly as a Breaker:
Arc::new(circuit_breaker::global()) then coerces to Arc<dyn Breaker>.