3 个不稳定版本
| 0.2.1 | 2021年2月23日 |
|---|---|
| 0.2.0 | 2020年12月21日 |
| 0.1.0 | 2020年12月19日 |
3 in #ratelimit
4,454 每月下载量
17KB
276 代码行
自适应退避
自适应退避通过简单的结构体 Backoffs 提供了一种智能退避机制,用于通过成功和失败调用退避对速率限制或失败操作的调用,然后返回等待时间。
对于自适应退避,随着失败和成功调用的增加,返回的持续时间最终收敛到一个值,以避免请求的速率限制。
用法
在您的 Cargo.toml 中包含
adaptive_backoff = "0.2"
并按照以下示例操作
自适应指数退避
以下是一个自适应的 ExponentialBackoff 示例,它从一个队列中工作,并在调用之间的最小延迟持续时间上收敛。它以 2.0 的倍数增长,最大为 300 秒。
use std::time::Duration;
use adaptive_backoff::prelude::*;
let mut backoff = ExponentialBackoffBuilder::default()
.factor(2.0)
.max(Duration::from_secs(300))
.adaptive()
.build()
.unwrap();
while let Some(item) = queue.pop() {
loop {
match worker_iter(&conn, &item).await {
Ok(_) => {
delay_for(backoff.success()).await;
break;
}
Err(_) => delay_for(backoff.fail()).await,
}
}
}
简单指数退避
如果在上面的示例中省略了自适应,则返回简单退避。它的 API 缺少 success() 和 fail(),而只能通过 wait() 返回递增的延迟,直到调用 reset() 来返回它。
use std::time::Duration;
use adaptive_backoff::prelude::*;
let mut backoff = ExponentialBackoffBuilder::default()
.factor(2.0)
.max(Duration::from_secs(30))
.build()
.unwrap();
while let Some(item) = queue.pop() {
loop {
match worker_iter(&conn, &item).await {
Ok(_) => {
delay_for(backoff.wait()).await;
break;
}
Err(_) => delay_for(backoff.wait()).await,
}
}
backoff.reset();
}
其他示例
依赖关系
~0.4–1MB
~20K SLoC