2个版本
0.1.1 | 2023年2月26日 |
---|---|
0.1.0 | 2023年2月26日 |
#911 在 异步
696 每月下载量
在 axum-keycloak-auth 中使用
16KB
280 代码行
try-again
重试直到不再能够或需要重试的同步或异步操作。
提供用于重试同步操作的 fn retry
。
提供用于重试异步操作的 async fn retry_async
。
重试的闭包可以返回任何实现了 NeedsRetry
的类型。这个特质已经为任何 Result
和 Option
实现了,允许你重试常见的错误结果。
需要重试策略。提供的 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