Jobs, cron y la cola de mensajes fallidos
Cómo ejecutar un trabajo fuera de una solicitud: qué es un trabajo, cómo se reintenta, cómo crea cron trabajos y qué hacer con los trabajos que terminan inactivos.
1. Poner en cola un trabajo
Un trabajo es una llamada en segundo plano a una función. Ponlo en cola desde un servidor con una clave service_role.
| Opción | Predeterminado | Significado |
|---|---|---|
payload | null | JSON dado a la función como cuerpo de la solicitud |
delaySecs | 0 | Segundos de espera antes del primer intento. El trabajo permanece pending hasta entonces. |
maxAttempts | 3 | Número total de intentos, incluido el primero. |
Lee un trabajo con getJob(id) o listJobs({ status, limit }) (limit está entre 1 y 500, el valor predeterminado es 50). El trabajo tiene un status, attempts, max_attempts, error y las fechas scheduled_at, started_at, completed_at.
enqueueJob, getJob y listJobs necesitan una clave service_role. Una clave pública recibe 403.
2. Qué recibe tu función
Un trabajo llama a tu función como cualquier otra solicitud, con tres diferencias que debes manejar:
| parte | Valor |
|---|---|
| Método | JOB (no POST) |
| Camino | /jobs/<job id> |
| cuerpo | El trabajo es payload, como JSON |
| Encabezados de identidad | Ninguno: x-aura-role y x-aura-user-id están ausentes |
Una llamada real registrada {"method":"JOB","path":"/jobs/d443d541-…","role":null,"userId":null,"body":"{\"items\":[\"a\",\"b\"],\"order\":42}"}.
Un trabajo se ejecuta sin un usuario: no confíe en x-aura-user-id. Si el trabajo pertenece a un usuario, coloque la identificación del usuario en la carga útil.
3. Ciclo de vida y reintentos
- Un trabajo ejecuta al menos una vez. Puede ejecutarse dos veces si un trabajador se detiene mientras se está ejecutando, así que haga que la función sea idempotente.
- Un intento fallido se vuelve a intentar después de un retraso fijo de 5 segundos, hasta que se alcanza
maxAttempts. Entonces el trabajo esdead. El retraso y el recuento de intentos predeterminado son configuraciones de servicio (JOB_RETRY_DELAY_SECS,JOB_MAX_RETRIES). - El servicio reclama un trabajo que todavía es
runningdespués de su concesión (450 segundos de forma predeterminada). - Los trabajos terminados se conservan durante 14 días de forma predeterminada.
Un trabajo es completed tan pronto como su función responde, cualquiera que sea el código de estado. En una ejecución real, una función que devolvió 500 produjo un trabajo completed después de un intento y nunca se volvió a intentar.
Un trabajo falla y se vuelve a intentar solo cuando falla la llamada misma: la función no existe o está inactiva, el tiempo de ejecución es inalcanzable o la llamada agota el tiempo de espera. Si desea volver a intentarlo cuando su propio código detecte un error, ponga en cola un nuevo trabajo desde el controlador (con delaySecs para una pausa) en lugar de confiar en el código de estado.
En la misma ejecución real, un trabajo para una función que no existe pasó por esta secuencia: el intento 1 falló a los 3 s con Fonction 'ghost' introuvable, el intento 2 falló aproximadamente a los 9 s y el trabajo se convirtió en dead con attempts igual a max_attempts.
4. La cola de mensajes fallidos
Los trabajos inactivos permanecen en la cola y se pueden enumerar y volver a intentar. Estas rutas aún no tienen ningún método SDK: use HTTP con una clave service_role.
Un reintento devuelve el trabajo a pending sin restablecer su contador de intentos, por lo que obtiene exactamente un intento más y regresa a dead si falla nuevamente. Corrija la causa (implemente la función que falta, por ejemplo) antes de volver a intentarlo.
5. Programar con cron
Una entrada cron no llama a la función en sí: cada vez que se activa, pone en cola un trabajo.
- La programación tiene 5 campos (
min hour day month weekday) o 6 campos (sec min hour day month weekday). Una programación de 5 campos tiene0segundos por delante:*/1 * * * *se almacena como0 */1 * * * *. - Alias como
@dailyse rechazan con un400que indica el formato esperado. - Los horarios están en UTC.
last_runynext_runsonnullhasta el primer disparo. En una ejecución real, una programación creada a las 15:40 se disparó a las 15:41:00 y luego mostrónext_run15:42:00.- La carga útil se congela cuando crea la entrada.
- Eliminar un nombre desconocido devuelve
404. Eliminar una entrada cron también evita que se active. - El SDK no tiene
getCronJoboupdateCronJob: elimine la entrada y créela nuevamente.
Para trabajos puramente de base de datos, la extensión Postgres pg_cron evita el viaje de ida y vuelta a una función: consulte la página Cron.