#backoff #retry #tokio #macro #async

backoff-macro

使用#[backoff]标记异步函数以获取默认的指数退避行为。(与tokio兼容)

2个不稳定版本

0.2.0 2024年5月23日
0.1.0 2024年5月23日

#27 in #backoff

MIT许可协议

6KB

backoff_macro

backoff_macro是一个Rust过程宏,它为异步函数添加了具有指数退避的重试逻辑。该crate利用backoffcrate来处理重试,并允许用户通过简单地使用#[backoff]来注释他们的函数,以启用此功能。

功能

  • 在失败时自动重试异步函数。
  • 使用指数退避来分散重试。
  • 简单且易于使用的属性宏。

安装

backoff_macro添加到您的Cargo.toml

[dependencies]
backoff_macro = "0.1.0"
backoff = "0.3.0"
tokio = { version = "1", features = ["full"] }

用法

要使用#[backoff]宏,只需用#[backoff]注释您的异步函数。该函数应返回一个Result<T, E>类型,其中E实现了From<E>特质,用于backoff::Error<E>

示例

以下是一个基本示例,演示了如何使用#[backoff]

use backoff_macro::backoff;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
use std::error::Error;
use tokio::main;

#[backoff]
async fn dummy_function(attempts: Arc<AtomicUsize>) -> Result<(), &'static str> {
    let current_attempts = attempts.fetch_add(1, Ordering::SeqCst);
    if current_attempts < 2 {
        Err("error")
    } else {
        Ok(())
    }
}

#[main]
async fn main() -> Result<(), Box<dyn Error>> {
    let attempts = Arc::new(AtomicUsize::new(0));

    let result = dummy_function(attempts.clone()).await;

    match result {
        Ok(_) => println!("Function succeeded after retries"),
        Err(e) => println!("Function failed after retries: {}", e),
    }

    Ok(())
}

说明

  1. 注释:使用#[backoff]注释您想要应用重试逻辑的异步函数。
  2. 重试逻辑:该宏将使用backoff::future::retry方法包装函数体。
  3. 返回类型:确保函数返回一个Result<T, E>类型。

贡献

欢迎贡献!如果您发现了一个错误或有一个功能请求,请在GitHub仓库中打开一个问题。

许可协议

本项目采用MIT许可协议。有关详细信息,请参阅LICENSE文件。

依赖项

~3–9.5MB
~82K SLoC