Skip to content

QueueBox

A transactional outbox and an idempotent inbox as one service. Postgres or SQL Server. RabbitMQ, Kafka, NATS and HTTP.

QueueBox is a self-hosted service. Your application writes a row in its own database transaction, and QueueBox delivers it. A broker or a webhook sends a message, and QueueBox stores it once, however often it arrives.

BEGIN;
INSERT INTO orders (id, customer_id, total) VALUES ('11111111-1111-1111-1111-111111111111', 'cust-42', 99.99);
INSERT INTO outbox (topic, key, payload)
VALUES ('order.created', 'cust-42', '{"orderId":"11111111-1111-1111-1111-111111111111"}');
COMMIT;

No lost messages

The outbox row commits with your business write, or neither commits. QueueBox retries a failed delivery and moves an exhausted message to a dead-letter state that you can replay.

No double processing

The inbox stores a message once per source and idempotency key. A consumer claims one message of an aggregate at a time, in order.

Order per key

The outbox delivers the rows of one key in insert order, at any concurrency and with any number of replicas.

Your database

QueueBox uses Postgres or SQL Server that you already run. It needs no broker of its own, and it never reads your payload unless a transform asks it to.