Skip to main content

Framework with scalable Kafka consumer/producer logic for IDU FastAPI services.

Project description

🦦 otteroad

code style: black PyPI version CI codecov License: Apache 2.0

logo

Kafka framework for FastAPI microservices in the IDU (Institute of Design and Urban Studies).

** The name was inspired by this text.


✨ Overview

otteroad is a Kafka framework designed for FastAPI-based microservices. It simplifies integration with Apache Kafka and supports:

  • ✅ Unified consumer & producer APIs
  • ✅ AVRO + Schema Registry support via Pydantic
  • ✅ Pluggable settings from .env, .yaml, or custom config
  • ✅ Structured event handlers with lifecycle hooks
  • ✅ Flexible handler registry and extensible processing pipeline
  • ✅ Designed for FastAPI services but works standalone

📦 Installation

pip install otteroad

Or via poetry:

poetry add otteroad

⚙️ Configuration

Kafka settings are defined via two classes:

  • KafkaConsumerSettings
  • KafkaProducerSettings

They can be created from any source:

from otteroad import KafkaConsumerSettings, KafkaProducerSettings

consumer_settings = KafkaConsumerSettings.from_env()
producer_settings = KafkaProducerSettings.from_yaml("config/kafka.yaml")

# define pydantic model/dataclass/dict/etc.
config = {"bootstrap.servers": "localhost: 9092"}
settings = KafkaProducerSettings.from_custom_config(config)

📡 Event Models (AVRO + Schema Registry)

Use AvroEventModel as the base for your event schemas. These are strict, typed messages validated via Pydantic.

from typing import ClassVar
from pydantic import Field
from otteroad.avro import AvroEventModel


class TerritoryCreated(AvroEventModel):
    """Model for message indicates that a territory has been created."""

    topic: ClassVar[str] = "urban.events"
    namespace: ClassVar[str] = "territories"
    schema_version: ClassVar[int] = 1
    schema_compatibility: ClassVar[str] = "BACKWARD"

    territory_id: int = Field(..., description="new territory identifier")

🧠 Handlers

Handlers process typed events. Extend BaseMessageHandler and implement core logic in handle(). Optional hooks: pre_process, post_process, on_startup, on_shutdown, handle_error.

ℹ️ Note for IDU services: It is strongly recommended to use only models from the models/ directory to ensure schema consistency and maintainability across services.

from otteroad.consumer import BaseMessageHandler
from otteroad.models import TerritoryCreated  # please, use only models from the models/ directory

class TerritoryCreatedHandler(BaseMessageHandler[TerritoryCreated]):
    async def handle(self, event, ctx):
        print(f"Territory created: {event.territory_id}")
        
    async def on_startup(self): ...
    
    async def on_shutdown(self): ...

🔄 Consumer

KafkaConsumerService manages lifecycle and worker threads; KafkaConsumerWorker pulls messages, resolves handlers and runs processing logic.

from otteroad import KafkaConsumerService

service = KafkaConsumerService(consumer_settings)
service.register_handler(TerritoryCreatedHandler())
service.add_worker(topics=["urban.events"]).start()

Under the hood, the pipeline is:

receive message -> validate -> pre_process -> handle -> post_process

If an error occurs, custom error handling or DQL logic can be added.


🚀 Producer

Use KafkaProducerClient to send strongly typed Avro events:

from otteroad import KafkaProducerClient
from otteroad.models import TerritoryCreated

async def send_event():
    async with KafkaProducerClient(producer_settings) as producer:
        event = TerritoryCreated(territory_id=1)
        await producer.send(event)

🧩 FastAPI Integration

For a simple integration example with FastAPI, see:

📄 Example

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

otteroad-0.1.6.tar.gz (33.1 kB view details)

Uploaded Source

Built Distribution

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

otteroad-0.1.6-py3-none-any.whl (52.9 kB view details)

Uploaded Python 3

File details

Details for the file otteroad-0.1.6.tar.gz.

File metadata

  • Download URL: otteroad-0.1.6.tar.gz
  • Upload date:
  • Size: 33.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.11.9 Windows/10

File hashes

Hashes for otteroad-0.1.6.tar.gz
Algorithm Hash digest
SHA256 38942bb178062da3f728cf78b92a64111d822d3f8fbcc64ba6580924e879c0f3
MD5 cf93f514160eb79f65fba2138e978f0b
BLAKE2b-256 39206116800a50dbce90a8789cbe089ec7b960ec2ce6e06e21cc4f7440aca56c

See more details on using hashes here.

File details

Details for the file otteroad-0.1.6-py3-none-any.whl.

File metadata

  • Download URL: otteroad-0.1.6-py3-none-any.whl
  • Upload date:
  • Size: 52.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.11.9 Windows/10

File hashes

Hashes for otteroad-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 30e5fa5b6cb931f81cc9a63b6d1038c26abdd07768c9f1468a8cc0eafdececfb
MD5 339237dc5100ee321f1cb73fed5e6410
BLAKE2b-256 0ce0ec89ab4b31773bba59d1f15393ddcb36c3514dd708e55539be56a5c33935

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