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 在 网络编程
1,393,976 每月下载量
用于 547 个 crates (152 个直接使用)
44KB
677 行
backoff
指数退避和重试。
灵感来源于 Google 的 google-http-java-client 库及其 Golang 版本。
使用功能 wasm-bindgen
或 stdweb
编译以在 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
的正常闭包代替。将retry
和retry_notify
方法转换为库根部的自由函数。
示例.
删除FutureOperation特质
https://github.com/ihrwein/backoff/pull/28
已删除FutureOperation
特质。将retry
和retry_notify
方法转换为库根部的自由函数。
示例.
功能标志更改
- 已删除
stdweb
标志,因为该项目已被放弃。
retry
和retry_notify
方法现在接受Backoff实例的所有权(之前为&mut)
示例.
许可证
许可协议为以下之一
- Apache License, Version 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT 或 http://opensource.org/licenses/MIT) 由您选择。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的,您提交的旨在包含在作品中的任何贡献,将按上述方式双许可,不附加任何额外的条款或条件。
依赖项
~0.3–12MB
~137K SLoC