When you save an order to the DB and then send a message to RabbitMQ, what happens if the DB succeeds but the network to RabbitMQ fails? You have Inconsistent Data. The Outbox Pattern is the solution.
Instead of talking to the broker directly, you save the message into a local **Outbox Table** in the SAME transaction as your business data. This guarantees that either both are saved, or neither are.
A background worker (or a tool like **Debezium**) reads the Outbox table every second and publishes the messages to the broker. Once a message is successfully delivered, it is marked as 'Processed' in the table. This guarantees **At-Least-Once Delivery** even if the network or the broker goes down for hours.
Q: "Why not just use Distributed Transactions (MSDTC / 2PC)?"
Architect Answer: "Two-Phase Commit (2PC) is an availability killer. It requires all resources to 'Lock' and agree before anyone can move forward. If one service is slow, the whole system hangs. In a microservices world, we prefer the Outbox Pattern because it allows each service to work at its own pace while ensuring eventual consistency without synchronous locking."