Skip to main content

omnixys-kafka

Omnixys shared async Kafka package — envelope producer, consumer with retry/DLQ/idempotency/circuit-breaker, decorator-driven handler dispatch, and header/topic utilities.

Installation

pip install omnixys-kafka

Features

  • Envelope producer: AIOKafkaEventProducer builds versioned KafkaEnvelopes and injects OpenTelemetry trace headers
  • Consumer: reliable KafkaConsumer with manual offset commit, partition pausing for delayed retries, per-topic circuit breakers and optional idempotency
  • Retry/DLQ: exponential backoff onto <topic>.retry, dead-lettering onto <topic>.dlq after max_retries
  • Handler decorators: @kafka_handler(topic), KafkaHandlerRegistry, KafkaEventDispatcher for in-process dispatch
  • Headers: create_kafka_headers()/KafkaHeaderCarrier builder and parse_headers() for the aiokafka wire format
  • Topics: retry_topic_name, dlq_topic_name, original_topic_name, expand_topic_names — one source of truth for derived topic names
  • DI: KafkaProvider container integration (dishka)
  • Serialization: compact JSON with UUID/datetime support

Usage

Handler registration (decorator + dispatcher)

from kafka import KafkaEventDispatcher, KafkaEnvelope, kafka_handler

@kafka_handler("event.created")
async def on_event_created(envelope: KafkaEnvelope, headers: dict[str, str]) -> None:
    print(envelope.event_id, envelope.payload, headers.get("x-request-id"))

dispatcher = KafkaEventDispatcher()
await dispatcher.dispatch("event.created", envelope, {"x-request-id": "r1"})
# or from raw bytes:
await dispatcher.dispatch_raw("event.created", value, [("x-retry-count", b"0")])

Producing

from aiokafka import AIOKafkaProducer
from kafka import AIOKafkaEventProducer

producer = AIOKafkaEventProducer(
    AIOKafkaProducer(bootstrap_servers="localhost:9092", enable_idempotence=True)
)
await producer.publish(event_name="event.created", payload={...}, topic="event.created", service="ticketing")
await producer.publish_raw("event.created.dlq", b"...", key="user-42")

Consuming with retry and DLQ

from kafka import KafkaConsumer, RetryConfig

consumer = KafkaConsumer(
    consumer=raw_consumer,                 # aiokafka.AIOKafkaConsumer
    bootstrap_servers="localhost:9092",
    retry_config=RetryConfig(max_retries=5),
)
consumer.register_handler("event.created", on_event_created)
await consumer.start()

Failures are retried with exponential backoff into event.created.retry, and dead-lettered into event.created.dlq once max_retries is exhausted. Header metadata (x-original-topic, x-retry-count, x-retry-at) routes retries back to the right handler.

Headers and topics

from kafka import create_kafka_headers, expand_topic_names, retry_topic_name

headers = create_kafka_headers()
headers.set("x-meta-service", "user")

retry_topic_name("event.created")                 # "event.created.retry"
expand_topic_names(["event.created"])             # original + retry + dlq variants

Testing

The package ships behavior-level tests (pytest, no broker needed):

uv run pytest -q          # 29 tests
uv run ruff check .       # lint
uv run mypy src/          # strict typing

License

GPL-3.0-or-later

Metadata

Release files for omnixys-kafka 3.0.5

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

Source distribution (sdist)

Source distribution for omnixys-kafka 3.0.5
File Size Uploaded
omnixys_kafka-3.0.5.tar.gz 64.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for omnixys-kafka 3.0.5
File Interpreter ABI Platform
omnixys_kafka-3.0.5-py3-none-any.whl Python 3 none any Details

Total release size: 77.6 kB

Release files / omnixys_kafka-3.0.5.tar.gz

Download URL omnixys_kafka-3.0.5.tar.gz
Size 64.5 kB
Tags Source
SHA-256 checksum
How to use checksums
77db0ae5e4248d45cadcebd39458980c5d08297e6a4714e36e28cf960b6b42f5
BLAKE2b-256 checksum
How to use checksums
fb7054b85e13df2fb41ccda43f536c15b13724bbc185d2d45f438766a70a47bd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","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}

Release files / omnixys_kafka-3.0.5-py3-none-any.whl

Download URL omnixys_kafka-3.0.5-py3-none-any.whl
Size 13.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
24aab1be5e6f1c3ccfdddee1c105585cfa8a90da709b35044d5bb531ee939076
BLAKE2b-256 checksum
How to use checksums
363e2dc80b71126786fa3f56d5defab0179f32fbda3560fa440a7b1e26378b26
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","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}

Release history Release notifications | RSS feed

4.0.0

2 release files

This release

3.0.5 This release

2 release files

3.0.4

2 release files

3.0.3

2 release files

3.0.2

2 release files

2.0.3

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