11 个版本

0.4.0 2021 年 12 月 14 日
0.3.0 2021 年 2 月 2 日
0.2.1 2020 年 7 月 15 日
0.1.6 2020 年 1 月 19 日
0.1.2 2017 年 5 月 28 日

#32网络编程

Download history 253559/week @ 2024-03-14 246105/week @ 2024-03-21 285875/week @ 2024-03-28 251555/week @ 2024-04-04 289686/week @ 2024-04-11 300715/week @ 2024-04-18 285502/week @ 2024-04-25 285715/week @ 2024-05-02 295600/week @ 2024-05-09 321035/week @ 2024-05-16 313043/week @ 2024-05-23 318960/week @ 2024-05-30 334344/week @ 2024-06-06 326976/week @ 2024-06-13 323940/week @ 2024-06-20 337297/week @ 2024-06-27

1,393,976 每月下载量
用于 547 个 crates (152 个直接使用)

MIT/Apache

44KB
677

backoff

指数退避和重试。

灵感来源于 Google 的 google-http-java-client 库及其 Golang 版本

Build Status Documentation

使用功能 wasm-bindgenstdweb 编译以在 WASM 环境中使用。由于它使用 std::thread::sleep,因此尚不支持 retry_notify

⚠️ 重大变更:在 重大变更 下查看迁移说明。

概述

backoff 是一个小型库,允许您根据退避策略重试操作。它提供

  • 错误类型,将错误封装为短暂或永久类型,
  • 包括指数在内的不同的退避算法,
  • 支持同步和异步代码。

同步示例

只需将您的可失败操作包装在闭包中,并将其传递给 retry

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

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

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

重试策略将根据 ExponentialBackoff 字段的 randomization_factor 字段使用抖动。请参阅文档以获取更多参数。

异步示例

futures 模块支持 futures

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
}

重大变更

0.3.x -> 0.4.x

向 Error::Transient 添加新字段

Transient 错误获得了第二个字段。对于处理像 HTTP 429 响应这样的速率限制非常有用。

要修复损坏的代码,只需将 Error::Transient() 的调用替换为 Error::transient()

0.2.x -> 0.3.x

删除 Operation trait

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

已删除Operation特质,请使用实现FnMut的正常闭包代替。将retryretry_notify方法转换为库根部的自由函数。

示例.

删除FutureOperation特质

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

已删除FutureOperation特质。将retryretry_notify方法转换为库根部的自由函数。

示例.

功能标志更改

  • 已删除stdweb标志,因为该项目已被放弃。

retryretry_notify方法现在接受Backoff实例的所有权(之前为&mut)

示例.

许可证

许可协议为以下之一

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您提交的旨在包含在作品中的任何贡献,将按上述方式双许可,不附加任何额外的条款或条件。

依赖项

~0.3–12MB
~137K SLoC