{
  "schema_version": 1,
  "diagram_type": "sequence",
  "meta": {
    "title": "Recorrido de una tarea asíncrona",
    "output": "examples/async-job-roundtrip.html",
    "viewBox": [
      820,
      920
    ],
    "animation": "trace",
    "visual_preset": "signal-flow",
    "quality_profile": "showcase",
    "views": [
      {
        "id": "accept-and-enqueue",
        "label": "Aceptar sin bloquear",
        "focus": [
          "client",
          "api",
          "queue"
        ],
        "note": "La API responde rápidamente después de guardar la tarea en la cola."
      },
      {
        "id": "work-and-retry",
        "label": "Trabajo en segundo plano y reintento",
        "focus": [
          "queue",
          "worker",
          "provider"
        ],
        "note": "Al agotarse el tiempo, la tarea vuelve a la cola sin mantener abierta la solicitud."
      },
      {
        "id": "observe-final-state",
        "label": "Comprobar el estado final",
        "focus": [
          "worker",
          "store",
          "notify",
          "client",
          "api"
        ],
        "note": "El webhook es la vía principal; la consulta periódica es una alternativa limitada."
      }
    ],
    "locale": "es"
  },
  "participants": [
    {
      "id": "client",
      "type": "external",
      "label": "Cliente",
      "sublabel": "aplicación móvil"
    },
    {
      "id": "api",
      "type": "backend",
      "label": "API de tareas",
      "sublabel": "entrada API"
    },
    {
      "id": "queue",
      "type": "messagebus",
      "label": "Cola",
      "sublabel": "trabajo persistente"
    },
    {
      "id": "worker",
      "type": "backend",
      "label": "Procesador",
      "sublabel": "segundo plano"
    },
    {
      "id": "provider",
      "type": "cloud",
      "label": "Proveedor",
      "sublabel": "API externa"
    },
    {
      "id": "store",
      "type": "database",
      "label": "Tareas",
      "sublabel": "fuente de referencia"
    },
    {
      "id": "notify",
      "type": "messagebus",
      "label": "Notificador",
      "sublabel": "webhook"
    }
  ],
  "segments": [
    {
      "from": 150,
      "to": 288,
      "label": "Aceptar"
    },
    {
      "from": 306,
      "to": 538,
      "label": "Segundo plano"
    },
    {
      "from": 554,
      "to": 800,
      "label": "Notificar y conciliar"
    }
  ],
  "messages": [
    {
      "from": "client",
      "to": "api",
      "y": 180,
      "label": "POST /jobs",
      "variant": "emphasis"
    },
    {
      "from": "api",
      "to": "queue",
      "y": 222,
      "label": "encolar tarea",
      "variant": "emphasis"
    },
    {
      "from": "api",
      "to": "client",
      "y": 264,
      "label": "202 + id. de tarea",
      "variant": "return"
    },
    {
      "from": "queue",
      "to": "worker",
      "y": 326,
      "label": "entregar",
      "variant": "emphasis"
    },
    {
      "from": "worker",
      "to": "provider",
      "y": 368,
      "label": "ejecutar tarea",
      "variant": "default"
    },
    {
      "from": "provider",
      "to": "worker",
      "y": 410,
      "label": "resultado / demora",
      "variant": "return"
    },
    {
      "from": "worker",
      "to": "queue",
      "y": 452,
      "label": "reintentar si demora",
      "variant": "dashed"
    },
    {
      "from": "worker",
      "to": "store",
      "y": 494,
      "label": "guardar estado final",
      "variant": "emphasis"
    },
    {
      "from": "worker",
      "to": "notify",
      "y": 566,
      "label": "job.completed",
      "variant": "dashed"
    },
    {
      "from": "notify",
      "to": "client",
      "y": 608,
      "label": "webhook firmado",
      "variant": "dashed"
    },
    {
      "from": "client",
      "to": "api",
      "y": 650,
      "label": "GET /jobs/:id",
      "variant": "default"
    },
    {
      "from": "api",
      "to": "store",
      "y": 692,
      "label": "consultar estado",
      "variant": "default"
    },
    {
      "from": "store",
      "to": "api",
      "y": 734,
      "label": "completado",
      "variant": "return"
    },
    {
      "from": "api",
      "to": "client",
      "y": 776,
      "label": "200 resultado final",
      "variant": "return"
    }
  ],
  "activations": [
    {
      "participant": "api",
      "from": 174,
      "to": 272,
      "type": "backend"
    },
    {
      "participant": "queue",
      "from": 216,
      "to": 334,
      "type": "messagebus"
    },
    {
      "participant": "worker",
      "from": 320,
      "to": 574,
      "type": "backend"
    },
    {
      "participant": "provider",
      "from": 362,
      "to": 416,
      "type": "cloud"
    },
    {
      "participant": "store",
      "from": 488,
      "to": 742,
      "type": "database"
    },
    {
      "participant": "notify",
      "from": 560,
      "to": 616,
      "type": "messagebus"
    },
    {
      "participant": "api",
      "from": 644,
      "to": 784,
      "type": "backend"
    }
  ],
  "cards": [
    {
      "dot": "cyan",
      "title": "Confirmación rápida",
      "items": [
        "El cliente recibe un identificador persistente antes de que comience la tarea",
        "La confirmación identifica al responsable de la cola",
        "La conexión original no espera la respuesta del proveedor"
      ]
    },
    {
      "dot": "orange",
      "title": "Recuperación limitada",
      "items": [
        "Las tareas que agotan el tiempo vuelven a la cola con una política de reintentos",
        "El estado final se guarda antes de notificar",
        "El almacén de tareas mantiene el estado de referencia"
      ]
    },
    {
      "dot": "emerald",
      "title": "Dos vías de consulta",
      "items": [
        "Un webhook firmado anuncia la finalización",
        "La consulta del estado es una alternativa al webhook, no otro flujo",
        "Ambas vías llegan al mismo estado final"
      ]
    }
  ]
}
