{
  "title": "Outbox Pattern",
  "description": "Transactional outbox pattern ensuring reliable event publishing",
  "type": "architecture-pattern",
  "data": {
    "nodes": [
      {
        "id": "service-order",
        "type": "service",
        "position": { "x": 100, "y": 200 },
        "data": {
          "mode": "full",
          "service": {
            "id": "order-service",
            "name": "Order Service",
            "owners": ["order-team"],
            "sends": ["OrderCreated"],
            "receives": ["CreateOrder"],
            "version": "1.0.0",
            "summary": "Processes orders and stores events in outbox table"
          }
        },
        "measured": {"width": 262, "height": 113}
      },
      {
        "id": "data-orders-db",
        "type": "data",
        "position": { "x": 100, "y": 350 },
        "data": {
          "mode": "full",
          "data": {
            "id": "orders-database",
            "name": "Orders Database",
            "owners": ["order-team"],
            "version": "1.0.0",
            "summary": "Contains orders table and outbox table in same transaction",
            "type": "Database"
          }
        },
        "measured": {"width": 262, "height": 98}
      },
      {
        "id": "data-outbox-table",
        "type": "data",
        "position": { "x": 450, "y": 350 },
        "data": {
          "mode": "full",
          "data": {
            "id": "outbox-table",
            "name": "Outbox Table",
            "owners": ["order-team"],
            "version": "1.0.0",
            "summary": "Transactional outbox storing unpublished events",
            "type": "Database"
          }
        },
        "measured": {"width": 262, "height": 98}
      },
      {
        "id": "service-outbox-publisher",
        "type": "service",
        "position": { "x": 450, "y": 200 },
        "data": {
          "mode": "full",
          "service": {
            "id": "outbox-publisher",
            "name": "Outbox Publisher",
            "owners": ["platform-team"],
            "sends": ["OrderCreated"],
            "receives": [],
            "version": "1.0.0",
            "summary": "Polls outbox table and publishes events to message broker"
          }
        },
        "measured": {"width": 262, "height": 98}
      },
      {
        "id": "channel-kafka",
        "type": "channel",
        "position": { "x": 800, "y": 200 },
        "data": {
          "mode": "full",
          "channel": {
            "id": "order-events",
            "name": "order-events",
            "version": "1.0.0",
            "summary": "Kafka topic for reliable order events"
          }
        },
        "measured": {"width": 262, "height": 100}
      },
      {
        "id": "event-order-created",
        "type": "event",
        "position": { "x": 1150, "y": 200 },
        "data": {
          "mode": "full",
          "message": {
            "id": "order-created",
            "name": "OrderCreated",
            "version": "1.0.0",
            "summary": "Event published via outbox pattern ensuring delivery"
          }
        },
        "measured": {"width": 262, "height": 98}
      },
      {
        "id": "service-inventory",
        "type": "service",
        "position": { "x": 1150, "y": 350 },
        "data": {
          "mode": "full",
          "service": {
            "id": "inventory-service",
            "name": "Inventory Service",
            "owners": ["inventory-team"],
            "sends": [],
            "receives": ["OrderCreated"],
            "version": "1.0.0",
            "summary": "Reliably receives order events via outbox pattern"
          }
        },
        "measured": {"width": 262, "height": 98}
      },
      {
        "id": "command-create-order",
        "type": "command",
        "position": { "x": 100, "y": 50 },
        "data": {
          "mode": "full",
          "message": {
            "id": "create-order",
            "name": "CreateOrder",
            "version": "1.0.0",
            "summary": "Command to create new order"
          }
        },
        "measured": {"width": 262, "height": 98}
      },
      {
        "id": "note-outbox-instructions",
        "type": "note",
        "position": { "x": 100, "y": 500 },
        "data": {
          "text": "📦 **Outbox Pattern**\n\nEnsures reliable event publishing using transactional outbox:\n\n**📝 Command** → **⚙️ Service** → **🗄️ Database + Outbox** → **📡 Publisher** → **📨 Kafka** → **📢 Events**\n\n**Key Benefits:**\n• **Guaranteed delivery** - Events stored in same transaction as business data\n• **At-least-once** - Events will be published even if publisher fails\n• **Consistency** - No lost events due to partial failures\n• **Reliability** - Survives service restarts and network issues\n\n**How it works:**\n1. **Service** saves business data + event in same transaction\n2. **Outbox Publisher** polls outbox table for new events\n3. **Events** published to message broker\n4. **Outbox records** marked as published\n5. **Downstream services** receive events reliably\n\n**💡 Pro tip:** Essential for microservices that must reliably publish domain events!",
          "color": "yellow"
        },
        "measured": {"width": 380, "height": 280},
        "width": 380,
        "height": 280
      }
    ],
    "edges": [
      {
        "source": "command-create-order",
        "target": "service-order",
        "label": "Process Command",
        "markerEnd": {"type": "arrowclosed", "color": "#000000"},
        "animated": false,
        "type": "default",
        "id": "xy-edge__command-create-order-service-order"
      },
      {
        "source": "service-order",
        "target": "data-orders-db",
        "label": "Saves Data",
        "markerEnd": {"type": "arrowclosed", "color": "#000000"},
        "animated": false,
        "type": "default",
        "id": "xy-edge__service-order-data-orders-db"
      },
      {
        "source": "service-order",
        "target": "data-outbox-table",
        "label": "Saves Event (same tx)",
        "markerEnd": {"type": "arrowclosed", "color": "#000000"},
        "animated": false,
        "type": "default",
        "id": "xy-edge__service-order-data-outbox-table"
      },
      {
        "source": "data-outbox-table",
        "target": "service-outbox-publisher",
        "label": "Polls for Events",
        "markerEnd": {"type": "arrowclosed", "color": "#000000"},
        "animated": true,
        "type": "animatedMessage",
        "id": "xy-edge__data-outbox-table-service-outbox-publisher"
      },
      {
        "source": "service-outbox-publisher",
        "target": "channel-kafka",
        "label": "Publishes",
        "markerEnd": {"type": "arrowclosed", "color": "#000000"},
        "animated": true,
        "type": "animatedMessage",
        "id": "xy-edge__service-outbox-publisher-channel-kafka"
      },
      {
        "source": "channel-kafka",
        "target": "event-order-created",
        "label": "Contains",
        "markerEnd": {"type": "arrowclosed", "color": "#000000"},
        "animated": true,
        "type": "animatedMessage",
        "id": "xy-edge__channel-kafka-event-order-created"
      },
      {
        "source": "event-order-created",
        "target": "service-inventory",
        "label": "Consumed by",
        "markerEnd": {"type": "arrowclosed", "color": "#000000"},
        "animated": true,
        "type": "animatedMessage",
        "id": "xy-edge__event-order-created-service-inventory"
      }
    ],
    "viewport": {"x": 50, "y": 50, "zoom": 0.6},
    "creationDate": "2025-01-01T00:00:00.000Z",
    "name": "Outbox Pattern",
    "version": "1.0.0",
    "source": "https://eventcatalog.dev",
    "appState": {},
    "id": "outbox-pattern"
  },
  "usecase": "Design Reliable Event Publishing",
  "mermaid": "flowchart LR\n    S[Service] --> DB[(Database)]\n    S --> O[(Outbox)]\n    O --> P[Publisher]\n    P --> K[Kafka]",
  "tags": ["Reliability", "Intermediate"]
}