#circuit-breaker #fault-tolerance #resilience

无std rssafecircuit

这个Rust库使用Tokio实现了异步支持的Circuit Breaker模式,管理失败状态和恢复策略。

1 个不稳定版本

0.1.0 2024年6月30日

#107 in 无标准库

自定义许可

12KB
139

rssafecircuit

这个Rust库使用Tokio实现了异步支持的Circuit Breaker模式,管理失败状态和恢复策略。

组件

  • CircuitBreakerState

  • 定义电路断路器可能状态的枚举

    • Closed:正常操作模式。
    • Open:由于太多失败而打开的电路断路器。
    • HalfOpen:电路断路器处于试验模式,以检查底层服务是否已恢复。
  • CircuitBreaker结构体

    • 管理电路断路器的状态和行为。
    • 跟踪失败、成功和状态之间的转换。

方法

new(max_failures, timeout, pause_time)

用于初始化新的CircuitBreaker实例的构造函数。

参数

  • max_failures:在触发断路器之前允许的最大连续失败次数。
  • timeout:断路器保持打开状态的秒数。
  • pause_time:在尝试重新检查服务之前等待的毫秒数。

execute(func)

在future中执行给定的异步函数(func),处理电路断路器逻辑

  • 在执行之前检查电路是否打开或半打开。
  • 跟踪成功和失败。
  • 根据失败次数转换状态。

handle_failure()

增加失败计数器,如果达到阈值则触发电路断路器。

handle_success()

在成功操作后重置电路断路器状态。

trip()

触发电路断路器,在达到失败阈值时将其设置为打开状态。

reset()

在恢复后将电路断路器重置为关闭状态。

set_on_open(callback)

设置在电路断路器打开时执行的回调函数。

set_on_close(callback)

设置在电路断路器关闭时执行的回调函数。

set_on_half_open(callback)

设置在电路断路器转换为半打开状态时执行的回调函数。

使用示例

以下是一个示例,演示如何在main.rs文件中使用CircuitBreaker,使用Tokio进行异步执行

use std::time::Duration;
use tokio::time::sleep;
use tokio::runtime::Runtime;
use rssafecircuit::CircuitBreaker; // Adjust to match your crate name and structure

fn main() {
    let rt = Runtime::new().unwrap();

    rt.block_on(async {
        let max_failures = 3;
        let timeout = 2;
        let pause_time = 1000;
        
        // Create a CircuitBreaker instance
        let mut breaker = CircuitBreaker::new(max_failures, timeout, pause_time);

        // Example operations
        let success_operation = || async { Ok("Operation successful".to_string()) };
        let failure_operation = || async { Err("Operation failed".to_string()) };

        // Example usage
        for _ in 0..=max_failures {
            let result = breaker.execute(success_operation.clone()).await;
            println!("Result: {:?}", result);
        }

        // Simulate max_failures+1 attempt to see the circuit breaker in action
        let result = breaker.execute(success_operation.clone()).await;
        println!("Result: {:?}", result);

        // Wait for the circuit breaker to potentially reset
        sleep(Duration::from_secs(timeout)).await;

        // Attempt after waiting, should be successful again
        let result = breaker.execute(success_operation.clone()).await;
        println!("Result: {:?}", result);

        // Trigger circuit breaker with failure attempts
        for _ in 0..=max_failures {
            let result = breaker.execute(failure_operation.clone()).await;
            println!("Result: {:?}", result);
        }

        // Another attempt to see circuit breaker in action
        let result = breaker.execute(failure_operation).await;
        println!("Result: {:?}", result);
    });
}

如何使用

安装

  1. 确保您已安装Rust和Cargo。
  2. rssafecircuit(或您的crate名称)作为依赖项添加到您的 Cargo.toml

使用

  1. 使用所需的配置参数创建CircuitBreaker实例。
  2. 定义操作(成功和失败场景)为异步闭包(async块)。
  3. 使用 execute() 方法通过熔断器运行操作,观察状态转换和处理故障。

回调函数(可选)

  • 使用 set_on_open()set_on_close()set_on_half_open() 方法设置回调函数,以在状态变化(打开、关闭、半开)时执行操作。

许可协议

本项目采用 MIT 许可协议 - 详细内容请参阅 LICENSE 文件。

依赖项

~2.6–8.5MB
~63K SLoC