11 releases

0.4.0 Dec 14, 2021
0.3.0 Feb 2, 2021
0.2.1 Jul 15, 2020
0.1.6 Jan 19, 2020
0.1.2 May 28, 2017

#1 in #backoff

Download history 215133/week @ 2023-11-02 198907/week @ 2023-11-09 206163/week @ 2023-11-16 189388/week @ 2023-11-23 234779/week @ 2023-11-30 230010/week @ 2023-12-07 226925/week @ 2023-12-14 109457/week @ 2023-12-21 115580/week @ 2023-12-28 201997/week @ 2024-01-04 188137/week @ 2024-01-11 227992/week @ 2024-01-18 220809/week @ 2024-01-25 227358/week @ 2024-02-01 247454/week @ 2024-02-08 160486/week @ 2024-02-15

901,454 downloads per month
Used in 465 crates (142 directly)

MIT/Apache

44KB
677 lines

backoff

Exponential backoff and retry.

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

Build Status 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
}

Breaking changes

0.3.x -> 0.4.x

Adding new field to Error::Transient

Transient errors got a second field. Useful for handling ratelimits like a HTTP 429 response.

To fix broken code, just replace calls of Error::Transient() with Error::transient().

0.2.x -> 0.3.x

Removal of Operation trait

https://github.com/ihrwein/backoff/pull/28

The Operation trait has been removed, please use normal closures implementing FnMut instead. The retry and retry_notify methods were converted to free functions, available in the crate's root.

Example.

Removal of FutureOperation trait

https://github.com/ihrwein/backoff/pull/28

The FutureOperation trait has been removed. The retry and retry_notify methods were converted to free functions, available in the crate's root.

Example.

Changes in feature flags

  • stdweb flag was removed, as the project is abandoned.

retry, retry_notify taking ownership of Backoff instances (previously &mut)

Example.

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.

Dependencies

~0.3–14MB
~145K SLoC