#retry #async #tokio #retry-async

try-again

重试同步和异步操作

2个版本

0.1.1 2023年2月26日
0.1.0 2023年2月26日

#911异步

Download history 17/week @ 2024-03-13 11/week @ 2024-03-20 34/week @ 2024-03-27 107/week @ 2024-04-03 100/week @ 2024-04-10 109/week @ 2024-04-17 211/week @ 2024-04-24 254/week @ 2024-05-01 182/week @ 2024-05-08 267/week @ 2024-05-15 148/week @ 2024-05-22 231/week @ 2024-05-29 126/week @ 2024-06-05 116/week @ 2024-06-12 247/week @ 2024-06-19 158/week @ 2024-06-26

696 每月下载量
axum-keycloak-auth 中使用

MIT/Apache

16KB
280 代码行

try-again

重试直到不再能够或需要重试的同步或异步操作。

提供用于重试同步操作的 fn retry

提供用于重试异步操作的 async fn retry_async

重试的闭包可以返回任何实现了 NeedsRetry 的类型。这个特质已经为任何 ResultOption 实现了,允许你重试常见的错误结果。

需要重试策略。提供的 Retry 类型提供了一个支持以下功能的实现:

  • 最大重试次数
  • 重试之间的延迟可以是:
    • None
    • 静态延迟
    • 指数级增加的延迟

需要延迟策略,并在用户闭包执行之间执行实际的延迟

  • 在同步情况下:可以使用 ThreadSleep {},阻塞当前线程直到下一次尝试应进行。
  • 在异步情况下:当使用Tokio运行时,可以使用 TokioSleep {}

可以实现其他延迟策略以支持async_std或其他异步运行时。

同步示例

use try_again::{retry, Delay, Retry, ThreadSleep};

fn some_fallible_operation() -> Result<(), ()> {
    Ok(())
}

let final_outcome = retry(
    Retry {
        max_tries: 5,
        delay: Some(Delay::Static {
            delay: Duration::from_millis(125),
        }),
    },
    ThreadSleep {},
    move || some_fallible_operation(),
);

异步示例

use try_again::{retry_async, Delay, Retry, TokioSleep};

async fn some_fallible_operation() -> Result<(), ()> {
    Ok(())
}

let final_outcome = retry_async(
    Retry {
        max_tries: 10,
        delay: Some(Delay::ExponentialBackoff {
            initial_delay: Duration::from_millis(125),
            max_delay: Some(Duration::from_secs(2)),
        }),
    },
    TokioSleep {},
    move || async move {
        some_fallible_operation().await
    },
).await;

依赖

~0.3–6.5MB
~27K SLoC