revoke-resilience
Resilience patterns module for the Revoke microservices framework, providing circuit breakers, rate limiters, retry mechanisms, and other fault tolerance patterns.
Features
- Circuit Breaker: Prevent cascading failures with automatic recovery
- Rate Limiter: Token bucket and sliding window algorithms
- Retry: Configurable retry policies with exponential backoff
- Bulkhead: Isolate resources to prevent total system failure
- Timeout: Prevent hanging operations
- Fallback: Graceful degradation strategies
- Combine Patterns: Chain multiple resilience patterns
Installation
Add to your Cargo.toml:
[]
= { = "0.1.0" }
Quick Start
use ;
use Duration;
async
Patterns
Circuit Breaker
Prevents cascading failures by stopping requests to failing services:
use ;
let breaker = builder
.failure_threshold // Open after 5 failures
.success_threshold // Close after 2 successes
.recovery_timeout
.build;
// Execute with circuit breaker
match breaker.call.await
// Check circuit state
println!;
println!;
Rate Limiter
Control request rates to prevent overload:
use ;
// Token bucket rate limiter
let limiter = token_bucket
.capacity // Bucket capacity
.refill_rate // Tokens per second
.build;
// Sliding window rate limiter
let limiter = sliding_window
.max_requests
.window
.build;
// Use rate limiter
if limiter.try_acquire else
// Async acquire (waits if needed)
limiter.acquire.await?;
// Check availability
let available = limiter.available_permits;
Retry
Automatic retry with various backoff strategies:
use ;
// Exponential backoff
let retry = exponential
.max_attempts
.initial_delay
.max_delay
.multiplier
.build;
// Fixed delay
let retry = fixed
.max_attempts
.delay
.build;
// With jitter
let retry = exponential
.with_jitter // 10% jitter
.build;
// Custom retry condition
let retry = builder
.max_attempts
.retry_on
.build;
// Execute with retry
let result = retry.call.await?;
Bulkhead
Isolate resources to prevent total failure:
use ;
// Semaphore bulkhead (limits concurrent executions)
let bulkhead = semaphore
.max_concurrent
.queue_size
.build;
// Thread pool bulkhead (isolates execution)
let bulkhead = thread_pool
.pool_size
.queue_size
.build;
// Execute with bulkhead
let result = bulkhead.call.await?;
// Check metrics
println!;
println!;
Timeout
Prevent operations from hanging:
use Timeout;
let timeout = new;
// Execute with timeout
match timeout.call.await
// With custom timeout per call
let result = timeout
.with_duration
.call
.await?;
Fallback
Provide alternative responses when primary fails:
use Fallback;
let fallback = new;
// Execute with fallback
let result = fallback
.call
.await?;
// Conditional fallback
let fallback = builder
.when
.with
.build;
Combining Patterns
Chain multiple resilience patterns for comprehensive protection:
use ;
let chain = new
.add
.add
.add
.add
.add;
// Execute through all patterns
let result = chain.call.await?;
Advanced Usage
Metrics and Monitoring
use ;
let metrics = new;
// Register components
metrics.register;
metrics.register;
// Collect metrics
let snapshot = metrics.collect;
println!;
println!;
// Export to Prometheus
let prometheus = metrics.export_prometheus;
Custom Policies
Create custom resilience policies:
use ;
Event Handling
React to resilience events:
use ;
let event_handler = new;
// Subscribe to events
event_handler.on_circuit_opened;
event_handler.on_rate_limit_exceeded;
// Attach to components
circuit_breaker.set_event_handler;
rate_limiter.set_event_handler;
Configuration
From File
# resilience.yaml
circuit_breakers:
api_breaker:
failure_threshold: 5
success_threshold: 2
recovery_timeout: 30s
rate_limiters:
api_limiter:
strategy: token_bucket
capacity: 100
refill_rate: 10.0
retry_policies:
default:
max_attempts: 3
initial_delay: 100ms
max_delay: 10s
multiplier: 2.0
use ResilienceConfig;
let config = from_file?;
let breaker = config.circuit_breaker?;
let limiter = config.rate_limiter?;
Environment Variables
use EnvConfig;
// RESILIENCE_CIRCUIT_BREAKER_THRESHOLD=5
// RESILIENCE_RATE_LIMIT_CAPACITY=100
let config = load?;
Best Practices
- Layer Patterns: Use multiple patterns for comprehensive protection
- Timeouts First: Always set timeouts to prevent hanging
- Circuit Breaker Tuning: Set thresholds based on service SLAs
- Rate Limit Fairly: Use per-client rate limiting for fairness
- Monitor Everything: Track all resilience metrics
- Test Failures: Regularly test failure scenarios
- Graceful Degradation: Always have a fallback plan
Performance Considerations
- Circuit breakers use atomic operations for minimal overhead
- Rate limiters are lock-free for high concurrency
- Retry delays don't block threads (async sleep)
- Bulkheads use efficient semaphore implementations
Examples
See the examples directory:
circuit_breaker.rs- Circuit breaker patternsrate_limiting.rs- Various rate limiting strategiesretry_patterns.rs- Retry with different backoff strategiescombined_resilience.rs- Combining multiple patternsservice_protection.rs- Complete service protection setup