Skip to main content

The Protobus micro-services framework - Python port

Project description

Protobus Python

A lightweight, scalable microservices message bus for Python. Leverages RabbitMQ for message routing and load balancing, combined with Protocol Buffers for efficient, type-safe serialization.

Note: This is the official Python port of Protobus, originally written in TypeScript. The API and architecture are designed to be as close to the original as possible.

Why Protobus?

Unlike transport-agnostic frameworks that abstract away the message broker, Protobus embraces RabbitMQ's native capabilities directly. We leverage topic exchanges, routing keys, competing consumers, dead-letter queues, and message persistence - rather than re-implementing routing logic at the application level.

RabbitMQ-Native Approach

Message Routing: By delegating routing to RabbitMQ's Erlang runtime instead of your Python process, Protobus eliminates the double-processing that transport-agnostic frameworks impose. The broker handles competing consumers, topic-based routing, and dead-letter queues natively.

Binary Serialization: Protocol Buffers provide 3-10x smaller payloads than JSON, with compile-time type safety and built-in backward compatibility. No more runtime schema guessing or JSON parsing overhead.

Polyglot Advantage

Since Protobus uses standard Protobuf schemas and AMQP protocol, implementing clients in other languages is straightforward. Currently available in TypeScript/Node.js and Python, with Java, Go, or Rust implementations requiring minimal effort.

Features

  • RPC Communication: Request-response pattern over message queues
  • Event System: Publish-subscribe with topic-based routing and wildcards
  • Auto-Reconnection: Exponential backoff with jitter for resilient connections
  • Message Retry: Automatic retry with dead-letter queue (DLQ) support
  • Custom Types: Extensible type system (BigInt, Timestamp built-in)
  • Async/Await: Built on asyncio and aio-pika for modern Python
  • CLI Tools: Generate types and service stubs from .proto files
  • Lifecycle Management: RunnableService with graceful shutdown handling

Requirements

  • Python 3.10 or higher
  • RabbitMQ 3.8 or higher

Installation

pip install protobus

Or install from source:

git clone https://github.com/ArielLaub/protobus-py.git
cd protobus-py
pip install -e .

Quick Start

1. Start RabbitMQ

docker-compose up -d

2. Create a Service

from protobus import RunnableService, Context

class CalculatorService(RunnableService):
    @property
    def service_name(self) -> str:
        return "calculator.MathService"

    async def add(self, data: dict, actor: str, correlation_id: str) -> dict:
        return {"result": data["a"] + data["b"]}

    async def multiply(self, data: dict, actor: str, correlation_id: str) -> dict:
        return {"result": data["a"] * data["b"]}

3. Run the Service

import asyncio
from protobus import Context

async def main():
    ctx = Context()
    await ctx.init("amqp://guest:guest@localhost:5672/")

    # Start with lifecycle management (handles SIGINT/SIGTERM)
    await CalculatorService.start(ctx, CalculatorService)

asyncio.run(main())

4. Create a Client

import asyncio
from protobus import Context, ServiceProxy

async def main():
    ctx = Context()
    await ctx.init("amqp://guest:guest@localhost:5672/")

    # Create proxy for the calculator service
    calc = ServiceProxy(ctx, "calculator.MathService")
    await calc.init()

    # Make RPC calls
    result = await calc.add({"a": 5, "b": 3})
    print(f"5 + 3 = {result['result']}")  # Output: 5 + 3 = 8

    result = await calc.multiply({"a": 4, "b": 7})
    print(f"4 * 7 = {result['result']}")  # Output: 4 * 7 = 28

    await ctx.close()

asyncio.run(main())

CLI Tools

Protobus includes CLI tools for code generation:

# Generate Python types from .proto files
protobus generate

# Generate a service stub
protobus generate:service calculator.MathService

# Show project setup instructions
protobus init

Configure in pyproject.toml:

[tool.protobus]
protoDir = "./proto"
typesOutput = "./types/proto.py"
servicesDir = "./services"

Documentation

API Reference

Advanced Topics

Sample Application

The sample/combatGame directory contains a complete example - a turn-based battle royale game with 6 AI players demonstrating:

  • Multiple services communicating via RPC
  • Event-based game state synchronization
  • Different player strategies

Run it:

python sample/combatGame/game_runner.py

Cross-Language Compatibility

This library is fully wire-compatible with the original TypeScript Protobus. Services written in Python and TypeScript can communicate seamlessly on the same message bus, thanks to Protocol Buffers' language-agnostic serialization format.

Original Project

This is the Python port of Protobus (TypeScript). The original project provides identical functionality for Node.js/TypeScript environments.

License

MIT License - Copyright (c) Remarkable Games Ltd.

See LICENSE for details.

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

protobus-1.3.0.tar.gz (40.8 kB view details)

Uploaded Source

Built Distribution

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

protobus-1.3.0-py3-none-any.whl (44.2 kB view details)

Uploaded Python 3

File details

Details for the file protobus-1.3.0.tar.gz.

File metadata

  • Download URL: protobus-1.3.0.tar.gz
  • Upload date:
  • Size: 40.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for protobus-1.3.0.tar.gz
Algorithm Hash digest
SHA256 fb85f0ef0658e50068e2e0faa0f4f162b97c19a705bc53d931f2e73e4b4d6ec3
MD5 be6253efa5f73cea1ac8bf3b88cc4b6e
BLAKE2b-256 d34e408011cbcc4fb7ef2b7d972bdf3ace595e4c0c51b2d70fb4481ae413545f

See more details on using hashes here.

Provenance

The following attestation bundles were made for protobus-1.3.0.tar.gz:

Publisher: publish.yml on ArielLaub/protobus-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file protobus-1.3.0-py3-none-any.whl.

File metadata

  • Download URL: protobus-1.3.0-py3-none-any.whl
  • Upload date:
  • Size: 44.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for protobus-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e179f57ad0d291cad67f443dd0912a7f9115ceb503e8e248a6647d28f8b22a81
MD5 47b7057a2774644608491be914b10ee6
BLAKE2b-256 e68aeb0dc515b78d0a10ed01280b7d5e05630389034c2d8a220e3eebe5277fcc

See more details on using hashes here.

Provenance

The following attestation bundles were made for protobus-1.3.0-py3-none-any.whl:

Publisher: publish.yml on ArielLaub/protobus-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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