# circuit-breaker Circuit breakers are an error handling machine inspired by the circuit breakers used in electrical systems. Just like their namesake, software circuit breakers prevent pushing traffic through a failing component until it has recovered. As of the current version, all `CircuitBreaker`s use a "leaky bucket" approach to backoffs. In the definition of a circuit breaker, the first `Natural` argument is the number of milliseconds that need to pass before an error is expunged. Coupled with an error threshold argument, this provides a surprising amount of flexibility for cirucit breakers in the wild, although you'll want to monitor and tune them over time. ### Using a circuit breaker The following short example illustrates how to define a circuit breaker & use it. ```haskell testBreaker :: CircuitBreaker "Test" 1000 4 testBreaker = undefined main :: IO () main = do -- Initializes the empty storage for all circuit breakers cbConf <- initialBreakerState -- Perform a bunch of "work". Because we have a 50% failure rate and trigger the breaker after four -- errors, this will cause the breaker to disable additional calls. forM_ [1..30] $ const . noteError . flip runReaderT cbConf $ withBreaker testBreaker computation -- simulating a backoff long enough to decrement the accumulated errors. threadDelay 5000000 noteError . flip runReaderT cbConf $ withBreaker testBreaker computation where noteError action = print =<< catchAny action (const $ pure (Left Failed)) -- | This computation fails 50% of the time computation :: ReaderT CircuitBreakerConf IO Int computation = do shouldFail <- liftIO randomIO when shouldFail $ error "Failed" pure 42 ``` The first thing to notice is that the `CircuitBreaker` definition exists entirely at the type level. This guarantees that the definition of a particular `CircuitBreaker` can't somehow change at runtime. All calls to `withBreaker` require a `CircuitBreakerConf` to be present in a reader environment. `initialBreakerState` simply initializes an empty `CircuitBreakerConf` to save you the trouble of creating one yourself. ### Contributing PRs and issues are welcome! Please let me know what you think could be improved or submit the patch yourself. ### License MIT