🚀 ¿Tu microservicio guarda datos pero a veces los eventos no se publican?
Bienvenido al caos de la inconsistencia... 😅
Por suerte, existe el Outbox Pattern 🧰✨
🔍 ¿Qué es?
Es una técnica que garantiza que tus eventos se publiquen solo si tu transacción en la base de datos fue exitosa ✅
¿Cómo lo logra?
📦 Guarda los eventos en una tabla outbox dentro de la misma transacción.
⚙️ Luego, un proceso en segundo plano se encarga de enviarlos al bus de eventos (Kafka, RabbitMQ, etc.).
💡 Ventajas clave:
1️⃣ Consistencia de datos sin complicaciones
2️⃣ Resiliencia incluso ante caídas del sistema
3️⃣ Desacoplamiento real entre microservicios
🛠️ Ideal para arquitecturas basadas en eventos, CQRS o DDD.
𝗙𝗹𝘂𝗷𝗼 𝗽𝗮𝘀𝗼 𝗮 𝗽𝗮𝘀𝗼 𝗱𝗲𝗹 𝗽𝗮𝘁𝗿𝗼́𝗻 𝗢𝘂𝘁𝗯𝗼𝘅:
🔢 ➊ El cliente envía una solicitud al Web API
Un usuario o sistema externo realiza una petición, por ejemplo:
POST /api/orders con los datos de una nueva orden.
🔢 ➋ El microservicio procesa la solicitud
Se crea una nueva entidad (por ejemplo, Order) y se guarda en la tabla correspondiente (Entity).
Además, se genera un evento (OrderCreated) que también se guarda en la tabla Outbox.
Todo esto ocurre dentro de una misma transacción para garantizar la consistencia.
🔢 ➌ La transacción se confirma
Si todo es exitoso, se ejecuta el COMMIT y se guardan tanto los datos del dominio como el evento en la tabla Outbox.
Si ocurre un error, nada se guarda, evitando inconsistencias entre base de datos y eventos.
🔢 ➍ El Publisher entra en acción
Un componente en segundo plano (como un BackgroundService) escanea periódicamente la tabla Outbox,
buscando eventos con estado Pendiente o NoEnviado.
🔢 ➎ El evento se publica al Event Bus
El Publisher transforma el evento en un mensaje y lo envía al Event Bus (como RabbitMQ, Kafka, etc.).
🔢 ➏ El evento es procesado por otros servicios
Otros microservicios suscritos al Event Bus reciben el evento (ej: OrderCreated) y reaccionan:
envían notificaciones, actualizan estados, crean facturas, etc.
🔢 ➐ El evento se marca como procesado
Una vez enviado con éxito, el evento puede marcarse como Enviado, o eliminarse de la tabla Outbox.
🧠 Conclusión
El patrón Outbox garantiza que:
⚠️ No se pierdan eventos si el bus de eventos falla temporalmente.
🔒 No se publiquen eventos si la operación principal no fue guardada.
🔁 Se pueda auditar, reintentar y mantener control total sobre los eventos emitidos.
#Microservices #OutboxPattern #Arquitectura #DotNet #EventDriven #Kafka #RabbitMQ #CQRS #CleanArchitecture #DevTips