Bulkhead middleware implementation for Swarmauri
Project description
Swarmauri Middleware Bulkhead
Concurrency isolation middleware for FastAPI applications. Limit the number of simultaneous requests to protect resources from overload and ensure reliable service operation.
Features
- Concurrency control restricts the number of in-flight requests using an
asyncio.Semaphore. - Configurable limits let you tune
max_concurrency(default: 10) to match service capacity. - Fail-fast validation guards against non-positive concurrency limits at initialization.
- Structured logging surfaces request flow and failure details for easier diagnostics.
- FastAPI compatibility enables seamless integration into ASGI middleware stacks.
Installation
Choose the tool that matches your workflow:
# pip
pip install swarmauri_middleware_bulkhead
# Poetry
poetry add swarmauri_middleware_bulkhead
# uv
uv add swarmauri_middleware_bulkhead
Quickstart
The middleware wraps a call_next handler and ensures that no more than max_concurrency requests execute at once. Run the example below with python quickstart.py to see the concurrency ceiling in action.
import asyncio
from fastapi import Request
from swarmauri_middleware_bulkhead import BulkheadMiddleware
async def main() -> None:
bulkhead = BulkheadMiddleware(max_concurrency=2)
active_requests = 0
peak_active_requests = 0
lock = asyncio.Lock()
async def call_next(request: Request):
nonlocal active_requests, peak_active_requests
async with lock:
active_requests += 1
peak_active_requests = max(peak_active_requests, active_requests)
try:
await asyncio.sleep(0.05)
return {"path": request.scope.get("path"), "handled": True}
finally:
async with lock:
active_requests -= 1
async def simulate_request(idx: int):
request = Request(scope={"type": "http", "path": f"/task/{idx}"})
return await bulkhead.dispatch(request, call_next)
responses = await asyncio.gather(*(simulate_request(i) for i in range(5)))
assert peak_active_requests <= bulkhead.max_concurrency
print("Peak concurrent requests:", peak_active_requests)
print("Responses:", responses)
if __name__ == "__main__":
asyncio.run(main())
Want to help?
If you want to contribute to swarmauri-sdk, read up on our guidelines for contributing that will help you get started.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file swarmauri_middleware_bulkhead-0.8.0.dev36.tar.gz.
File metadata
- Download URL: swarmauri_middleware_bulkhead-0.8.0.dev36.tar.gz
- Upload date:
- Size: 7.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a6b87220665295ec3899e930768e5bc3ec8956b04f8298d62e7a8a4634a2ae44
|
|
| MD5 |
4043eea48c1d78d0d6a9a9207ac4c8cc
|
|
| BLAKE2b-256 |
eff5c51e8144b79ec07f004b45910b062aa8cf9ebd6e5337e18676ffec1a9ca6
|
File details
Details for the file swarmauri_middleware_bulkhead-0.8.0.dev36-py3-none-any.whl.
File metadata
- Download URL: swarmauri_middleware_bulkhead-0.8.0.dev36-py3-none-any.whl
- Upload date:
- Size: 9.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
53536cfa0f9526cc2659852b53459d4155daa57a2cbb194e5c2b275bd99ca369
|
|
| MD5 |
883da6d988995339a8fc6bd5ee3cb7ba
|
|
| BLAKE2b-256 |
fdf9d50d5d3adad95013750ca62e994b76571f080ea020c8fd64d4d65c0b45c7
|