Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-resilience

Resilience pipelines for Pudu: retry, circuit breaker, timeout, fallback, hedging, rate limiting, and chaos injection

0.1.0Apache-2.01

InstallClose

CircuitBreaking.pudu

Pudu34 lines1.7 KB

GitHub ↗
1/** @Examples.CircuitBreaking.Program — a circuit opening and recovering */2module CircuitBreaking34import Std.Io as Io5import PuduLangResilience.CircuitBreaker as CircuitBreaker6import PuduLangResilience.Clock as Clock7import PuduLangResilience.Context as Context8import PuduLangResilience.Pipeline as Pipeline9import PuduLangResilience as Resilience1011/// Fails a dependency until its circuit opens, waits out the break, and recovers.12fn main() -> Int {13  let clock = Clock.manual(0)14  let provider = CircuitBreaker.stateProvider()15  let options = CircuitBreaker.Options{..CircuitBreaker.defaults(), failureRatio: 0.5d, minimumThroughput: 2, samplingDuration: 10000, breakDuration: 1000, stateProvider: Some(provider)}16  let settings = Pipeline.Options{..Pipeline.defaults(), clock: Clock.ofManual(&clock)}17  let pipeline = match Pipeline.buildWith(&settings, [CircuitBreaker.strategy(options)]) {18    case Ok(found) => found19    case Err(invalid) => {20      let _said = Io.writeErrorLine(Pipeline.explain(&invalid))21      return 122    }23  }24  let failing = fn(_context: Context.Context) -> Resilience.Outcome[Int, Str] { Resilience.raise("service unavailable") }25  let _first = Pipeline.execute(&pipeline, failing)26  let _second = Pipeline.execute(&pipeline, failing)27  let rejected = Pipeline.execute(&pipeline, failing)28  let _open = Io.writeLine("while open: " + Resilience.summarize(&rejected))29  Clock.advance(&clock, 1000)30  let probe = Pipeline.execute(&pipeline, fn(_context: Context.Context) -> Resilience.Outcome[Int, Str] { Ok(200) })31  let _closed = Io.writeLine("after the break: " + Resilience.summarize(&probe) + ", state " + show(CircuitBreaker.state(&provider)))32  if CircuitBreaker.state(&provider) == Some(CircuitBreaker.Closed) { 0 } else { 1 }33}34