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