Skip to content
GitHubDiscord

Resilience (lexigram-resilience)

Resilience patterns for the Lexigram Framework (circuit breaker, retry, bulkhead, rate limiting, throttle, fallback)


lexigram-resilience provides circuit breakers, retry policies, bulkhead isolation, timeouts, rate limiting, throttling, fallback patterns, resilience pipelines, and idempotency key management. All implementations are async-first and designed for high-concurrency workloads. Distributed backends are available for circuit breakers, rate limiters, and idempotency stores when shared state across instances is required.


Terminal window
uv add lexigram-resilience
# Optional extras
uv add "lexigram-resilience[idempotency-redis,idempotency-database]"
from lexigram import Application
from lexigram.di.module import Module, module
# Import the module from the package
from lexigram.resilience import ResilienceModule
@module(imports=[ResilienceModule.configure()])
class AppModule(Module):
pass
app = Application(modules=[AppModule])
if __name__ == "__main__":
app.run()

Zero-config usage: Call ResilienceModule.configure() with no arguments to use defaults.

application.yaml
resilience:
circuit_breaker:
failure_threshold: 5
recovery_timeout: 60.0
retry:
max_attempts: 3
base_delay: 1.0
bulkhead:
max_concurrent: 10
Section titled “Option 2 — Profiles + Environment Variables (recommended)”
Terminal window
export LEX_RESILIENCE__ENABLED=true
# Environment variables for each field
from lexigram.resilience.config import ResilienceConfig
from lexigram.resilience import ResilienceModule
config = ResilienceConfig(...)
ResilienceModule.configure(config)
FieldDefaultEnv varDescription
circuit_breaker.failure_threshold5LEX_RESILIENCE__CIRCUIT_BREAKER__FAILURE_THRESHOLDFailures required to open the circuit
circuit_breaker.recovery_timeout60.0LEX_RESILIENCE__CIRCUIT_BREAKER__RECOVERY_TIMEOUTSeconds in open state before half-open probe
circuit_breaker.success_threshold3LEX_RESILIENCE__CIRCUIT_BREAKER__SUCCESS_THRESHOLDSuccesses in half-open state to close the circuit
retry.max_attempts3LEX_RESILIENCE__RETRY__MAX_ATTEMPTSTotal attempts including initial call
retry.base_delay1.0LEX_RESILIENCE__RETRY__BASE_DELAYBase delay between retries in seconds
retry.max_delay60.0LEX_RESILIENCE__RETRY__MAX_DELAYMaximum retry delay cap in seconds
retry.backoff_factor2.0LEX_RESILIENCE__RETRY__BACKOFF_FACTORExponential multiplier applied to base delay
bulkhead.max_concurrent10LEX_RESILIENCE__BULKHEAD__MAX_CONCURRENTMaximum concurrent calls
bulkhead.queue_size100LEX_RESILIENCE__BULKHEAD__QUEUE_SIZEWaiting queue depth before rejection
timeout.timeout30.0LEX_RESILIENCE__TIMEOUT__TIMEOUTDefault operation timeout in seconds
idempotency.ttl3600LEX_RESILIENCE__IDEMPOTENCY__TTLCached result TTL in seconds
MethodDescription
ResilienceModule.configure(config)Configure with explicit ResilienceConfig
ResilienceModule.stub()Minimal config for testing
  • CircuitBreaker — Opens circuit after repeated failures, prevents cascading failures
  • CircuitBreakerRegistry — Named circuit breaker lookup and management
  • RetryPolicy — Exponential backoff, jitter, retry on specific exceptions
  • Bulkhead — Semaphore-based concurrency limiting with queue support
  • TimeoutManager — Async context manager for operation timeouts
  • RateLimiter — Token bucket, sliding window, and distributed rate limiting
  • Throttler — Request throttling with configurable limits and windows
  • ResiliencePipeline — Composable pipeline chaining multiple resilience patterns
  • Idempotency subsystem — Idempotency key management with in-memory, database, and Redis backends
async with Application.boot(modules=[ResilienceModule.stub()]) as app:
# your test code
...

In-memory backends are safe for testing with no external dependencies:

from lexigram.resilience import (
InMemoryCircuitBreakerBackend,
InMemoryIdempotencyStore,
)
cb = CircuitBreaker(name="test_cb") # Uses InMemoryCircuitBreakerBackend
store = InMemoryIdempotencyStore() # Local-only
FileWhat it contains
src/lexigram/resilience/module.pyResilienceModule class with factory methods
src/lexigram/resilience/di/provider.pyResilienceProvider — wires resilience protocols into DI container
src/lexigram/resilience/config.pyResilienceConfig and BulkheadConfig
src/lexigram/resilience/circuit/Circuit breaker implementations (in-memory + distributed backends)
src/lexigram/resilience/retry/Retry policy implementations with backoff strategies
src/lexigram/resilience/bulkhead/Bulkhead semaphore-based concurrency control
src/lexigram/resilience/rate_limiter/Token bucket, sliding window, distributed rate limiters
src/lexigram/resilience/idempotency/Idempotency decorator, stores, middleware, config