#backoff #adaptive #rate-limiting #throttle

adaptive_backoff

用于智能退避速率限制或易出错资源的库

3 个不稳定版本

0.2.1 2021年2月23日
0.2.0 2020年12月21日
0.1.0 2020年12月19日

3 in #ratelimit

Download history 470/week @ 2024-03-13 1140/week @ 2024-03-20 1158/week @ 2024-03-27 1680/week @ 2024-04-03 950/week @ 2024-04-10 1936/week @ 2024-04-17 1496/week @ 2024-04-24 1466/week @ 2024-05-01 1096/week @ 2024-05-08 485/week @ 2024-05-15 1557/week @ 2024-05-22 1743/week @ 2024-05-29 722/week @ 2024-06-05 1352/week @ 2024-06-12 1184/week @ 2024-06-19 832/week @ 2024-06-26

4,454 每月下载量

MIT 许可证

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();
}

其他示例

有对退避实现的测试,其中包含对外部 API 的示例使用和预期输出。请参阅 简单指数示例自适应指数退避示例

依赖关系

~0.4–1MB
~20K SLoC