Skip to main content

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 name
  • create_redis: Factory function returning Redis client
  • produce_events: Enable event stream (default: False)
  • telemetry_config: Optional telemetry configuration

Methods:

  • add(data: T) -> dict: Add item to stream
  • process(options, callback): Process stream items
  • clear(): Clear stream data
  • get_stream_info(): Get stream statistics
  • get_consumer_groups_info(): Get consumer group info
  • create_event_stream(): Create event tracking stream

QueueItem[T]

Represents a queue item being processed.

Attributes:

  • id: Unique message ID
  • data: Message data (type T)
  • attempts: Number of processing attempts
  • report_progress: Async function to report progress

StartFrom

Enum for consumer group starting position:

  • StartFrom.OLDEST: Start from beginning
  • StartFrom.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

process_redis_events-5.0.6.tar.gz (39.4 kB view details)

Uploaded Source

Built Distribution

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

process_redis_events-5.0.6-py3-none-any.whl (17.8 kB view details)

Uploaded Python 3

File details

Details for the file process_redis_events-5.0.6.tar.gz.

File metadata

  • Download URL: process_redis_events-5.0.6.tar.gz
  • Upload date:
  • Size: 39.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for process_redis_events-5.0.6.tar.gz
Algorithm Hash digest
SHA256 817a2b5dcc5ccd7ba9409b61ee7541b2098c77d05967adaba9c6db5f4c252eae
MD5 237bbee9e565684ee846eae6251ee524
BLAKE2b-256 ee49595bfc7b97514113d08d2e7fa0783355e8efcc6bafa1fb7e6bafe443592c

See more details on using hashes here.

File details

Details for the file process_redis_events-5.0.6-py3-none-any.whl.

File metadata

File hashes

Hashes for process_redis_events-5.0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 9464fcc067bda4badcca3d37a3426a524a0d40aa8cc7ee7aa7d27b2581139179
MD5 66edeccae9da43a87b262770b6e6d266
BLAKE2b-256 4af4057ef04eff3022e7c20a1e214bcd0f31af2cceeea5adaf761fae2daaee90

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