
CircuitBreaking.pudu
Pudu34 lines1.7 KB
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 Resilience101112fn 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