Skip to content

hypervideo/backoff

 
 

Repository files navigation

maybe-backoff

Exponential backoff and retry. This is a fork of backoff. The parent repo has been unmaintained for a while and this version provides up-to-date dependencies and a MaybeBackoff interface that streamlines conditional backoff usage.


Inspired by the retry mechanism in Google's google-http-java-client library and its Golang port.

CI Crates.io Documentation

Compile with feature wasm-bindgen or stdweb for use in WASM environments. retry_notify is not yet supported, as it uses std::thread::sleep.

⚠️ BREAKING CHANGES: migration instructions under Breaking changes.

Overview

backoff is small crate which allows you to retry operations according to backoff policies. It provides:

  • Error type to wrap errors as either transient of permanent,
  • different backoff algorithms, including exponential,
  • supporting both sync and async code.

Sync example

Just wrap your fallible operation into a closure, and pass it into retry:

use backoff::{retry, ExponentialBackoff, Error};

let op = || {
    reqwest::blocking::get("http://example.com").map_err(Error::transient)
};

let _ = retry(&mut ExponentialBackoff::default(), op);

The retry policy will use jitters according to the randomization_factor field of ExponentialBackoff. Check the documentation for more parameters.

Async example

Futures are supported by the futures module:

use backoff::ExponentialBackoff;
use backoff::future::retry;

async fn fetch_url(url: &str) -> Result<String, reqwest::Error> {
    retry(ExponentialBackoff::default(), || async {
        println!("Fetching {}", url);
        Ok(reqwest::get(url).await?.text().await?)
    })
    .await
}

License

Licensed under either of

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the Work by You, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

About

Exponential backoff and retry for Rust.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Rust 97.1%
  • Nix 2.2%
  • Other 0.7%