Skip to main content

Resilience patterns library (async) with circuit breaker, bulkhead, retry, and timeout patterns

Project description

Resilience_H8

A robust Python library for implementing resilience patterns in microservices architectures with concurrency control.

Features

  • Bulkhead Pattern: Isolate failures and prevent system-wide cascading failures by limiting concurrent operations
  • Circuit Breaker Pattern: Fail fast and apply backpressure when systems are overloaded
  • Retry Pattern: Automatically retry failed operations with configurable backoff and jitter
  • Timeout Pattern: Set maximum execution times for operations to prevent resource exhaustion
  • Concurrency Control: Built-in task management for safe async operations
  • Decorator API: Simple function decorators for all resilience patterns
  • Composable Patterns: Combine multiple resilience patterns with proper execution order
  • Type Safety: Full typing support with generics for better IDE integration

Installation

# From PyPI (recommended for production)
pip install resilience_h8

# From source (for development)
git clone https://github.com/yourusername/resilience_h8.git
cd resilience_h8
pip install -e .

Quick Start

import asyncio
import structlog
from httpx import AsyncClient, RequestError, TimeoutException

from resilience_h8 import ResilienceService, StandardTaskManager

# Setup logging and task manager
logger = structlog.get_logger()
task_manager = StandardTaskManager(max_workers=10, logger=logger)

# Create resilience service
resilience = ResilienceService(task_manager=task_manager, logger=logger)

# Apply resilience patterns to an async function
@resilience.with_retry(max_retries=3, jitter=True)
@resilience.with_circuit_breaker(failure_threshold=5, name="api_client")
@resilience.with_timeout(timeout=5.0)
async def fetch_data(client: AsyncClient, url: str):
    response = await client.get(url)
    response.raise_for_status()
    return response.json()

# Or use the combined decorator
@resilience.with_resilience(
    retry_config={
        "max_retries": 3,
        "backoff_factor": 1.0,
        "jitter": True,
        "retry_on_exceptions": [TimeoutException, RequestError]
    },
    circuit_config={
        "failure_threshold": 5,
        "recovery_timeout": 30.0,
        "name": "api_client"
    },
    timeout=5.0
)
async def fetch_data_combined(client: AsyncClient, url: str):
    response = await client.get(url)
    response.raise_for_status()
    return response.json()

# Example usage
async def main():
    client = AsyncClient()
    try:
        data = await fetch_data(client, "https://api.example.com/data")
        print(f"Received data: {data}")
    finally:
        await client.aclose()
        task_manager.cancel_all_tasks()

if __name__ == "__main__":
    asyncio.run(main())

Resilience Patterns

Bulkhead Pattern

Limits the number of concurrent operations to prevent resource exhaustion.

from resilience_h8 import StandardBulkhead

# Create a bulkhead
bulkhead = StandardBulkhead(
    name="api_client",
    max_concurrent=10,
    max_queue_size=20,
    logger=logger
)

# Use with decorator
@bulkhead.with_bulkhead(timeout=5.0)
async def my_function():
    # Your code here
    pass

# Or directly
result = await bulkhead.execute(my_function, timeout=5.0)

Circuit Breaker Pattern

Prevents cascading failures by failing fast when a dependent service is unavailable.

from resilience_h8 import CircuitBreaker, StandardCircuitBreaker

# Create a circuit breaker
circuit_breaker = StandardCircuitBreaker(
    name="api_client",
    failure_threshold=5,
    recovery_timeout=30.0,
    logger=logger
)

# Use with decorator
@circuit_breaker.circuit_break(fallback=fallback_function)
async def my_function():
    # Your code here
    pass

# Or directly
result = await circuit_breaker.execute(my_function, fallback=fallback_function)

Retry Pattern

Automatically retries failed operations with configurable backoff and jitter.

from resilience_h8 import RetryHandler, StandardRetryHandler

# Create a retry handler
retry_handler = StandardRetryHandler(logger=logger)

# Use with decorator
@retry_handler.retry(
    max_retries=3,
    backoff_factor=1.0,
    jitter=True,
    retry_on_exceptions=[ConnectionError, TimeoutError]
)
async def my_function():
    # Your code here
    pass

# Or directly
result = await retry_handler.execute(
    my_function,
    max_retries=3,
    backoff_factor=1.0,
    jitter=True
)

Development

Setting up the Development Environment

# Clone the repository
git clone https://github.com/yourusername/resilience_h8.git
cd resilience_h8

# Install development dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run type checking
mypy --config-file=mypy.ini

Project Structure

resilience_h8/
├── src/
│   └── resilience_h8/
│       ├── concurrency/      # Concurrency management tools
│       ├── custom_types/     # Custom type definitions
│       ├── interfaces/       # Interface definitions
│       └── resilience/       # Resilience pattern implementations
├── tests/                    # Test suite
├── pyproject.toml           # Package configuration
└── README.md                # This file

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

resilience_h8-0.1.5.tar.gz (27.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

resilience_h8-0.1.5-py3-none-any.whl (30.4 kB view details)

Uploaded Python 3

File details

Details for the file resilience_h8-0.1.5.tar.gz.

File metadata

  • Download URL: resilience_h8-0.1.5.tar.gz
  • Upload date:
  • Size: 27.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.9

File hashes

Hashes for resilience_h8-0.1.5.tar.gz
Algorithm Hash digest
SHA256 b9b680267879aad69b6d033d9dda60064824ffd8ef0c5f3740ab4a1f15848604
MD5 4743eb27b76ba9b7548109f43278170e
BLAKE2b-256 c8a378885f6531529a1da75c9cf1e4476d1d42029d77f768a2eb77cca7d2895a

See more details on using hashes here.

File details

Details for the file resilience_h8-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: resilience_h8-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 30.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.9

File hashes

Hashes for resilience_h8-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 8d7523fb7aaa00889545d768f8a0c72772b0470cf85c70cef0a87c6e6f52467c
MD5 5c0e79fd8a6bfac6440e149c9ac59777
BLAKE2b-256 42d2848b63d18de6beed8840e2eda196e5f59728b03d408a7d3a9ee0d4744082

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page