BabelQueue is an open-source message standard that lets services written in different languages share the same queue. The idea is plain: take the envelope off language-specific serialisation and pin it to a strict JSON schema.
The problem
In polyglot architectures the queue is usually the most brittle seam. The PHP side writes serialize() output, the Python side cannot read it, and teams end up with translation services or hand-written glue in between. That layer adds latency and is the first thing to break when the message schema changes.
The approach
BabelQueue defines one envelope on the wire: the job name is a URN, the payload is plain JSON, and the meta fields are fixed. Whatever language the producer is written in, it writes the same bytes; whatever language the consumer is written in, it reads the same schema. No class is shared across languages, so there is no shared package version to keep in step.
The ecosystem
Six native SDKs exist — PHP, Python, Go, Node.js, Java, .NET — each integrating with the common frameworks of its ecosystem: Laravel and Symfony, Celery and Django, Asynq, BullMQ and NestJS, Spring Boot, MassTransit. Installation goes through your own package manager; no bridge service is involved.
Operations
The standard is broker-agnostic and sits on top of existing infrastructure. Because every envelope carries a trace_id, a message’s journey from one language to another appears as a single flow in distributed tracing tools.
BabelQueue is open source; the SDKs and the schema definition are developed on GitHub.
Key features
- A strict JSON envelope schema
- Native SDKs for PHP, Python, Go, Node.js, Java, and .NET
- Adapters for Laravel, Symfony, Celery, Django, Asynq, BullMQ, NestJS, Spring Boot, and MassTransit
- Broker-agnostic, with seven brokers supported
- A built-in trace_id on every message
- URN-based message addressing
Frequently asked questions
Is BabelQueue a broker?+
No. BabelQueue is a queue standard and a family of SDKs that runs on top of the broker you already have. It brings no infrastructure of its own — it defines the contract between producers and consumers.
Which languages are supported?+
Native SDKs exist for PHP, Python, Go, Node.js, Java, and .NET. Each ships an adapter for the frameworks of its ecosystem: Laravel and Symfony, Celery and Django, Asynq, BullMQ and NestJS, Spring Boot, MassTransit.
How does it solve the PHP serialize() problem?+
The envelope is a strict JSON schema rather than language-specific serialisation. The bytes on the wire are identical in every language, so a message produced by PHP is read natively by a Go or .NET consumer.
Do we have to share classes between services?+
No. Messages are addressed by URN, such as `urn:babel:orders:created`, and mapped to a handler on the consumer side. No class or package is shared across languages.
Does it work with distributed tracing?+
The envelope carries a `trace_id` field, so the same trace identity travels with the message across languages and services.
Let’s build your next project together
Tell us your idea and we’ll design the right solution for you.
Get in touch