Fallback middleware for Tower services.
Provides alternative responses when the inner service fails, enabling graceful degradation and backup service routing.
Overview
The fallback pattern allows you to provide alternative responses when your primary service fails. This is useful for:
- Returning cached or stale data when the primary source is unavailable
- Providing degraded functionality instead of complete failure
- Routing to backup services
- Transforming errors into user-friendly responses
Fallback Strategies
Static Value
Return a fixed value when the service fails:
use FallbackLayer;
use ServiceBuilder;
#
# ;
let layer = value;
Fallback Function
Compute a response based on the error:
use FallbackLayer;
#
#
let layer = from_error;
Fallback with Request Context
Access both the original request and error:
use FallbackLayer;
use Arc;
use HashMap;
#
# ;
let cache: = new;
let cache_clone = clone;
let layer = from_request_error;
Backup Service
Route to an alternative service (async):
use FallbackLayer;
#
# ;
let layer = service;
Error Transformation
Convert errors to a different type (still returns error, not success):
use FallbackLayer;
#
#
// Note: This changes the error type, so layer types must align
let layer = exception;
Selective Error Handling
Only trigger fallback for specific errors:
use FallbackLayer;
#
#
let layer: = builder
.value
.handle // Only fallback on retryable errors
.build;
Composition with Other Layers
Fallback works well with other resilience patterns:
use FallbackLayer;
use ServiceBuilder;
#
# ;
# async
Events
The fallback service emits events for observability:
Success: Inner service succeeded, no fallback neededFailedAttempt: Inner service failed, fallback will be attemptedApplied: Fallback was successfully appliedFailed: Fallback itself failed (service fallback only)Skipped: Error didn't match predicate, propagated as-is