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);
});
}
如何使用
安装
- 确保您已安装Rust和Cargo。
- 将
rssafecircuit
(或您的crate名称)作为依赖项添加到您的Cargo.toml
。
使用
- 使用所需的配置参数创建CircuitBreaker实例。
- 定义操作(成功和失败场景)为异步闭包(async块)。
- 使用
execute()
方法通过熔断器运行操作,观察状态转换和处理故障。
回调函数(可选)
- 使用
set_on_open()
、set_on_close()
和set_on_half_open()
方法设置回调函数,以在状态变化(打开、关闭、半开)时执行操作。
许可协议
本项目采用 MIT 许可协议 - 详细内容请参阅 LICENSE 文件。
依赖项
~2.6–8.5MB
~63K SLoC