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

RateLimiting.pudu

Pudu41 lines1.5 KB

GitHub ↗
1/** @Examples.RateLimiting.Program — a token bucket guarding a pipeline */2module RateLimiting34import Std.Io as Io5import PuduLangResilience.Clock as Clock6import PuduLangResilience.Context as Context7import PuduLangResilience.Limiter.TokenBucket as TokenBucket8import PuduLangResilience.Pipeline as Pipeline9import PuduLangResilience.RateLimiter as RateLimiter10import PuduLangResilience as Resilience1112/// Spends a bucket of three tokens, is rejected, and is admitted again after a refill.13fn main() -> Int {14  let clock = Clock.manual(0)15  let bucket = match TokenBucket.create(&TokenBucket.Options{..TokenBucket.defaults(), tokenLimit: 3, tokensPerPeriod: 3, replenishmentPeriod: 1000, clock: Clock.ofManual(&clock)}) {16    case Ok(found) => found17    case Err(problems) => {18      let _said = Io.writeErrorLine(problems.join("; "))19      return 120    }21  }22  let pipeline = match Pipeline.build([RateLimiter.strategy(RateLimiter.using(bucket))]) {23    case Ok(found) => found24    case Err(invalid) => {25      let _said = Io.writeErrorLine(Pipeline.explain(&invalid))26      return 127    }28  }29  let request = fn(_context: Context.Context) -> Resilience.Outcome[Int, Str] { Ok(1) }30  var admitted = 031  for _call in [1, 2, 3, 4] {32    let outcome = Pipeline.execute(&pipeline, request)33    let _shown = Io.writeLine(Resilience.summarize(&outcome))34    if outcome == Ok(1) { admitted = admitted + 1 }35  }36  Clock.advance(&clock, 1000)37  let refilled = Pipeline.execute(&pipeline, request)38  let _after = Io.writeLine("after a refill: " + Resilience.summarize(&refilled))39  if admitted == 3 && refilled == Ok(1) { 0 } else { 1 }40}41