Skip to main content

ss-utils-circuit-breaker

A Python async circuit breaker implementation with optional Redis (coredis) support for distributed state.

Installation

# Basic installation (in-memory state only)
uv add ss-utils-circuit-breaker

# With Redis support
uv add ss-utils-circuit-breaker[redis]

Quick Start

Basic Usage (In-Memory)

from ss_utils_circuit_breaker import CircuitBreaker, CircuitBreakerError

# Create a circuit breaker
breaker = CircuitBreaker(
    name="my_api",
    failure_threshold=5,  # Open after 5 failures
    recovery_timeout=60,  # Try again after 60 seconds
)

@breaker
async def call_external_api():
    # Your async API call here
    async with httpx.AsyncClient() as client:
        response = await client.get("https://api.example.com/data")
        response.raise_for_status()
        return response.json()

# Usage
try:
    data = await call_external_api()
except CircuitBreakerError:
    # Circuit is open - service is known to be unavailable
    data = get_cached_data()
except Exception:
    # Regular failure
    pass

With Redis (Distributed State)

from ss_utils_circuit_breaker import RedisCircuitBreaker

# Create a Redis-backed circuit breaker
breaker = RedisCircuitBreaker(
    name="my_api",
    redis_url="localhost:6379",
    namespace="circuit_breaker",  # Redis key prefix
    failure_threshold=5,
    recovery_timeout=60,
)

@breaker
async def call_external_api():
    # State is shared across all instances via Redis
    pass

Circuit Breaker States

CLOSED (Normal)
    │
    ▼ (failures >= threshold)
   OPEN (Blocking)
    │
    ▼ (after recovery_timeout)
HALF_OPEN (Testing)
    │
    ├─► (success) ──► CLOSED
    │
    └─► (failure) ──► OPEN
  • CLOSED: Normal operation. Calls pass through, failures are counted.
  • OPEN: Circuit is tripped. Calls fail immediately with CircuitBreakerError.
  • HALF_OPEN: After timeout, one test call is allowed. Success closes circuit, failure reopens it.

Configuration Example

import httpx
from ss_utils_circuit_breaker import CircuitBreaker

# Only count connection errors as failures
api_breaker = CircuitBreaker(
    name="external_api",
    failure_threshold=3,
    recovery_timeout=30,
    expected_exception=(httpx.ConnectError, httpx.TimeoutException),
)

@api_breaker
async def fetch_data():
    async with httpx.AsyncClient(timeout=10.0) as client:
        return await client.get("https://api.example.com/data")

Testing

# Run tests
uv run pytest

# With coverage
uv run pytest --cov

License

MIT

Release files for ss-utils-circuit-breaker 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ss-utils-circuit-breaker 0.0.1
File Size Uploaded
ss_utils_circuit_breaker-0.0.1.tar.gz 109.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ss-utils-circuit-breaker 0.0.1
File Interpreter ABI Platform
ss_utils_circuit_breaker-0.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 114.0 kB

Release files / ss_utils_circuit_breaker-0.0.1.tar.gz

Download URL ss_utils_circuit_breaker-0.0.1.tar.gz
Size 109.1 kB
Tags Source
SHA-256 checksum
How to use checksums
45e234fd5a0a0c52435e48ef043e83ab5e95f591bad63fdfb318e904ef1d07a2
BLAKE2b-256 checksum
How to use checksums
29fbbc1da3a28525163e153a9bde65fc8f8237714e31c5401f7b136dc05feb64
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / ss_utils_circuit_breaker-0.0.1-py3-none-any.whl

Download URL ss_utils_circuit_breaker-0.0.1-py3-none-any.whl
Size 4.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2c9abe86505a99cb526474d9cece49451d19063a57b66267e301a4361ce3e387
BLAKE2b-256 checksum
How to use checksums
83e48dbdce043874c5dc623e075d9ad4264c6daaab99a0024f2937d7a4dae4ea
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

0.0.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page