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.2

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.2
File Size Uploaded
omnixys_kafka-3.0.2.tar.gz 64.1 kB Details

Built distribution (wheel)

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

Total release size: 77.2 kB

Release files / omnixys_kafka-3.0.2.tar.gz

Download URL omnixys_kafka-3.0.2.tar.gz
Size 64.1 kB
Tags Source
SHA-256 checksum
How to use checksums
781c1f4e6cd4a6a8631ff48a25a0a0e7588a86d653487ffc5ceabf5e56f99915
BLAKE2b-256 checksum
How to use checksums
b4ab66115c2abb47b330f597858d37cf767e5d55cfd74ad09d3aea6c782d7843
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","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.2-py3-none-any.whl

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

3.0.5

2 release files

3.0.4

2 release files

3.0.3

2 release files

This release

3.0.2 This release

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