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.1.tar.gz (40.9 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.1-py3-none-any.whl (44.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: protobus-1.3.1.tar.gz
  • Upload date:
  • Size: 40.9 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.1.tar.gz
Algorithm Hash digest
SHA256 994fcdd7524fd021b21196ee7a53bfb7273180e1ca36a5e05ee84ac99c42cd72
MD5 24dd3ca5ce26351d4ddd6efa5b073eb5
BLAKE2b-256 a1fbca96c2d8ce7540368861a2ae723f8791ebcc080fabac4b2b56cc823f1ea4

See more details on using hashes here.

Provenance

The following attestation bundles were made for protobus-1.3.1.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.1-py3-none-any.whl.

File metadata

  • Download URL: protobus-1.3.1-py3-none-any.whl
  • Upload date:
  • Size: 44.3 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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9e02282e07ad4aa37cd5a55bfa9f4c0631c2c85e9bdca6b533a403cdbb05a9d1
MD5 41cb5d9412fcb12fe2266d15f5c211d7
BLAKE2b-256 f1d8672e034cc199ea256c9e54c4f550944976785220be17da7aa3ba005199ad

See more details on using hashes here.

Provenance

The following attestation bundles were made for protobus-1.3.1-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