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

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.3
File Size Uploaded
omnixys_kafka-3.0.3.tar.gz 64.4 kB Details

Built distribution (wheel)

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

Total release size: 77.5 kB

Release files / omnixys_kafka-3.0.3.tar.gz

Download URL omnixys_kafka-3.0.3.tar.gz
Size 64.4 kB
Tags Source
SHA-256 checksum
How to use checksums
14f1b534b0d4de6bb73ff68d574b8bb032f10765c56f14b055c273762b307f41
BLAKE2b-256 checksum
How to use checksums
803be93ead0ece9beeda146b4066740102f5cea7a6fd2a8248b7fec43872b02f
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.3-py3-none-any.whl

Download URL omnixys_kafka-3.0.3-py3-none-any.whl
Size 13.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
88e1323a7e80f1ecee7742ad10327d2149eb29ddba758726d3d200608c0072cd
BLAKE2b-256 checksum
How to use checksums
70e3bd7f753c3d00c98ecf889b56628ad1b9611484dddd06b23bc9a5569e2db1
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

This release

3.0.3 This release

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