A Python library for processing Redis Stream events with consumer groups
Project description
Process Redis Events - Python
A Python library for processing Redis Stream events with consumer groups, providing robust event processing with automatic retries, dead letter queues, and OpenTelemetry integration.
Features
- Type-Safe: Full type hints and mypy compatibility
- Consumer Groups: Built-in support for Redis consumer groups
- Automatic Retries: Configurable retry logic with dead letter queue
- Heartbeat Management: Automatic lease extension for long-running tasks
- Telemetry: OpenTelemetry integration for metrics and tracing
- Event Streaming: Optional event stream for progress tracking
- Async/Await: Built on asyncio for high performance
Installation
pip install process-redis-events
For development:
pip install process-redis-events[dev]
Quick Start
import asyncio
from redis.asyncio import Redis
from process_redis_events import Stream, StartFrom
# Define your data type
from typing import TypedDict
class MyData(TypedDict):
foo: str
# Create a stream
async def main():
stream = Stream[MyData](
name="my-stream",
create_redis=lambda: Redis.from_url("redis://localhost"),
produce_events=True
)
# Add data to the stream
await stream.add({"foo": "bar"})
# Process events
async def process_item(item):
print(f"Processing: {item.data}")
# Your processing logic here
await stream.process(
options={
"consumer_group": "my-group",
"signal": asyncio.Event(), # Use for graceful shutdown
},
callback=process_item
)
asyncio.run(main())
Advanced Usage
With Data Transformation
from process_redis_events import QueueItem
async def transform(data_list: list[MyData]) -> list[dict]:
return [{"bar": item["foo"]} for item in data_list]
async def process_item(item: QueueItem[dict]):
print(f"Transformed data: {item.data}")
await item.report_progress(0.5, "Halfway done")
await item.report_progress(1.0, "Complete")
await stream.process(
options={
"consumer_group": "my-group",
"map": transform,
"signal": shutdown_event,
"batch_size": 20,
"concurrency": 10,
"lease_ms": 30000,
},
callback=process_item
)
Error Handling and Retries
def should_retry(attempt: int, data: MyData) -> bool:
# Retry up to 3 times
return attempt < 3
await stream.process(
options={
"consumer_group": "my-group",
"should_retry": should_retry,
"signal": shutdown_event,
},
callback=process_item
)
API Reference
Stream[T]
Main class for processing Redis streams.
Constructor Parameters:
name: Stream namecreate_redis: Factory function returning Redis clientproduce_events: Enable event stream (default: False)telemetry_config: Optional telemetry configuration
Methods:
add(data: T) -> dict: Add item to streamprocess(options, callback): Process stream itemsclear(): Clear stream dataget_stream_info(): Get stream statisticsget_consumer_groups_info(): Get consumer group infocreate_event_stream(): Create event tracking stream
QueueItem[T]
Represents a queue item being processed.
Attributes:
id: Unique message IDdata: Message data (type T)attempts: Number of processing attemptsreport_progress: Async function to report progress
StartFrom
Enum for consumer group starting position:
StartFrom.OLDEST: Start from beginningStartFrom.LATEST: Start from latest
Testing
# Run tests
pytest
# Run with coverage
pytest --cov=process_redis_events
# Type checking
mypy process_redis_events
License
ISC License - see LICENSE file for details
Contributing
Contributions welcome! Please ensure:
- All tests pass
- Code is type-checked with mypy
- Code is formatted with black
- Follow existing patterns and conventions
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
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 process_redis_events-5.0.3.tar.gz.
File metadata
- Download URL: process_redis_events-5.0.3.tar.gz
- Upload date:
- Size: 37.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b85c40892a667263aa1bd560b602ec819c742574c4918004c6057a2f8b4c1bf6
|
|
| MD5 |
8f981eb866fa59c0d44980715cbbab15
|
|
| BLAKE2b-256 |
b459d5c123f8fcbab1b8fd86ecdb4579f38aec7228b7c0fa8375c3cf4d20408a
|
File details
Details for the file process_redis_events-5.0.3-py3-none-any.whl.
File metadata
- Download URL: process_redis_events-5.0.3-py3-none-any.whl
- Upload date:
- Size: 17.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d0b367d8ab78c8a724b5484886b0c9fcd15ce1d8122c6e5d7524b7665db91486
|
|
| MD5 |
4fde90d6bab777914997255bc5db274d
|
|
| BLAKE2b-256 |
00f4a4ef0ff983851ed9f5ade4bc910c65ca7666f5b73a66a6c2bef197c30d64
|