use ai_lib_rust::resilience::circuit_breaker::{CircuitBreaker, CircuitBreakerConfig};
use ai_lib_rust::resilience::rate_limiter::{RateLimiter, RateLimiterConfig};
use std::time::Duration;
#[tokio::main]
async fn main() {
println!("=== AI-Lib Resilience Patterns Demo ===\n");
demo_circuit_breaker();
demo_rate_limiter().await;
demo_combined_patterns().await;
}
fn demo_circuit_breaker() {
println!("--- Example 1: Circuit Breaker ---\n");
let config = CircuitBreakerConfig {
failure_threshold: 3,
cooldown: Duration::from_secs(5),
};
let circuit_breaker = CircuitBreaker::new(config);
println!("Circuit Breaker Configuration:");
println!(" - Failure threshold: 3");
println!(" - Cooldown: 5 seconds\n");
println!("Simulating operations...\n");
for i in 1..=2 {
if circuit_breaker.allow().is_ok() {
println!("Request {}: Allowed (simulating success)", i);
circuit_breaker.on_success();
}
}
for i in 3..=5 {
if circuit_breaker.allow().is_ok() {
println!("Request {}: Allowed (simulating failure)", i);
circuit_breaker.on_failure();
} else {
println!("Request {}: BLOCKED by circuit breaker", i);
}
}
println!("\nCircuit state after failures:");
if circuit_breaker.allow().is_err() {
println!(" Circuit is OPEN - requests are blocked");
}
println!("\nNote: Circuit will close after 5 second cooldown\n");
}
async fn demo_rate_limiter() {
println!("--- Example 2: Rate Limiter ---\n");
let config = RateLimiterConfig::from_rps(5.0).expect("Valid RPS");
let rate_limiter = RateLimiter::new(config);
println!("Rate Limiter Configuration:");
println!(" - Rate: 5 requests/second");
println!(" - Burst capacity: 5\n");
println!("Attempting rapid requests (acquire will wait if needed)...\n");
for i in 1..=8 {
let start = std::time::Instant::now();
match rate_limiter.acquire().await {
Ok(_) => {
let elapsed = start.elapsed();
if elapsed.as_millis() > 10 {
println!("Request {}: Allowed (waited {:?})", i, elapsed);
} else {
println!("Request {}: Allowed immediately", i);
}
}
Err(e) => println!("Request {}: Error: {}", i, e),
}
}
println!();
}
async fn demo_combined_patterns() {
println!("--- Example 3: Combined Resilience Patterns ---\n");
let cb_config = CircuitBreakerConfig {
failure_threshold: 5,
cooldown: Duration::from_secs(30),
};
let circuit_breaker = CircuitBreaker::new(cb_config);
let rl_config = RateLimiterConfig::from_rps(10.0).expect("Valid RPS");
let rate_limiter = RateLimiter::new(rl_config);
println!("Production Setup:");
println!(" - Circuit Breaker: 5 failures -> open, 30s cooldown");
println!(" - Rate Limiter: 10 RPS\n");
println!("Simulating production request flow...\n");
for i in 1..=10 {
if rate_limiter.acquire().await.is_err() {
println!("Request {}: REJECTED by rate limiter", i);
continue;
}
if circuit_breaker.allow().is_err() {
println!("Request {}: REJECTED by circuit breaker (open)", i);
continue;
}
let success = i % 3 != 0;
if success {
println!("Request {}: SUCCESS", i);
circuit_breaker.on_success();
} else {
println!("Request {}: FAILED (recorded)", i);
circuit_breaker.on_failure();
}
}
println!("\n=== Best Practices ===\n");
println!("1. Always use rate limiting for external API calls");
println!("2. Wrap remote calls with circuit breakers");
println!("3. Implement exponential backoff for retries");
println!("4. Monitor circuit breaker state for alerting");
println!("5. Tune thresholds based on your SLOs");
}