#retry #async #networking

easy_retry

一个简单易用的 Rust 重试库

1 个不稳定版本

0.1.0 2024年2月13日

#31#retry

49 每月下载量

MIT 许可证

24KB
275

Workflow Status

easy_retry

Easy Retry

easy_retry 是一个 Rust 库,它提供用于不同策略的重试操作的工具。

此库提供了多种重试策略,包括线性、指数及其异步版本。您可以选择最适合您需求的策略。

该库旨在简单易用。它提供了一个单一的枚举 EasyRetry,表示不同的重试策略。您可以通过调用 EasyRetry 枚举上的一个 new_* 方法来创建新的重试策略。

该库提供了一个 run 方法,该方法接受一个闭包并以指定的重试策略运行操作。如果操作在所有重试后失败,则 run 方法返回操作的结果,或者返回一个错误。

run 方法期望闭包返回一个 Result 类型。应该包含操作结果的 Ok 变体,而应该包含在操作过程中发生的错误的 Err 变体。

功能

  • 线性重试:在这种策略中,重试之间的延迟是恒定的。
  • 指数重试:在这种策略中,重试之间的延迟在每次重试后加倍。
  • 线性异步重试:这是线性重试策略的异步版本。此功能仅在启用 async 功能时可用。
  • 指数异步重试:这是指数重试策略的异步版本。此功能仅在启用 async 功能时可用。

示例

use easy_retry::EasyRetry;

fn my_sync_fn(_n: &str) -> Result<(), std::io::Error> {
    Err(std::io::Error::new(std::io::ErrorKind::Other, "generic error"))
}

// Retry the operation with a linear strategy (1 second delay, 2 retries)
let retry_strategy = EasyRetry::new_linear(1, 2);
let result = retry_strategy.run(|| my_sync_fn("Hi"));
assert!(result.is_err());

异步示例

use easy_retry::EasyRetry;

async fn my_async_fn(_n: u64) -> Result<(), std::io::Error> {
   Err(std::io::Error::new(std::io::ErrorKind::Other, "generic error"))
}

#[tokio::main]
async fn main() {
    // Retry the operation with an exponential strategy (1 second delay, 2 retries)
    let retry_strategy = EasyRetry::new_exponential_async(1, 2);
    let result = retry_strategy.run_async(|| my_async_fn(42)).await;
    assert!(result.is_err());

}

使用方法

将其添加到您的 Cargo.toml

[dependencies]
easy_retry = "0.1.0"

然后,将其添加到您的crate根目录(main.rslib.rs

extern crate easy_retry;

现在,您可以使用 EasyRetry 枚举来创建重试策略

use easy_retry::EasyRetry;

let retry_strategy = EasyRetry::new_linear(100, 5);

许可证

此项目采用 MIT 许可证。

许可证:MIT

依赖关系

~0–1.3MB
~22K SLoC