Course contentsShow
← Databases & SQL
Lesson 1726 of 1,95316. Distributed Data ArchitecturesFree lesson

Outbox Pattern

Ensure transactional consistency between database updates and message broker events.

In this lesson, you will learn how to maintain strict transactional consistency between your local database state and external message brokers using the Outbox Pattern.

The Distributed Consistency Problem

In a distributed system, you often need to update a record in your database and simultaneously notify other services via a message broker (like Kafka or RabbitMQ). If you update the database and then send a message, the system might crash between those two steps, leading to an inconsistent state. Conversely, if you send the message first and the database update fails, you've broadcasted a false state to the rest of your architecture. Since you cannot participate in a distributed transaction across a SQL database and a remote message broker, you need a different approach.

Implementing the Outbox Pattern

The Outbox Pattern solves this by turning the "send message" step into a local database operation. Instead of publishing the message directly, your application performs two steps within a single ACID-compliant database transaction:

  1. Update the business entity (e.g., orders).
  2. Insert the message into a dedicated outbox table in the same database.

Because these operations are wrapped in a single transaction, the database guarantees that either both happen or neither happens.

BEGIN;
  UPDATE orders SET status = 'COMPLETED' WHERE id = 123;
  INSERT INTO outbox (aggregate_id, event_type, payload) 
  VALUES (123, 'ORDER_COMPLETED', '{"order_id": 123}');
COMMIT;

Once committed, a separate background process—a "Message Relayer"—periodically polls the outbox table or reads the database transaction logs (Change Data Capture), publishes the messages to the broker, and then deletes or marks the records as processed.

Why This Matters

By decoupling the database write from the message publication, you move from a synchronous, error-prone sequence to an asynchronous, reliable pipeline. Even if the message broker is temporarily offline, your business data remains consistent, and the relayer will eventually deliver the messages once connectivity is restored. This approach is fundamental to building resilient event-driven architectures without needing complex distributed locking mechanisms.

Key Takeaway: The Outbox Pattern ensures consistency by treating message creation as a local database transaction, guaranteeing that your events are always synchronized with your state changes.