Emplois, cron et file d'attente de lettres mortes
Comment exécuter un travail en dehors d'une requête : qu'est-ce qu'un travail, comment il est réessayé, comment cron crée des travaux et que faire des travaux qui finissent par disparaître.
1. Mettre un travail en file d'attente
Un travail est un appel en arrière-plan à une fonction. Mettez-le en file d'attente à partir d'un serveur avec une clé service_role.
| Options | Par défaut | Signification |
|---|---|---|
payload | null | JSON donné à la fonction comme corps de la requête |
delaySecs | 0 | Quelques secondes à attendre avant la première tentative. Le travail reste pending jusque-là. |
maxAttempts | 3 | Nombre total de tentatives, la première incluse |
Vous relisez un travail avec getJob(id) ou listJobs({ status, limit }) (limit est compris entre 1 et 500, 50 par défaut). Le travail comporte un status, attempts, max_attempts, error et les dates scheduled_at, started_at, completed_at.
enqueueJob, getJob et listJobs nécessitent une clé service_role. Une clé publique reçoit 403.
2. Ce que reçoit votre fonction
Un travail appelle votre fonction comme n'importe quelle autre requête, avec trois différences que vous devez gérer :
| Partie | Valeur |
|---|---|
| Méthode | JOB (et non POST) |
| Chemin | /jobs/<job id> |
| Corps | Le travail est payload, en JSON |
| En-têtes d'identité | Aucun : x-aura-role et x-aura-user-id sont absents |
Un véritable appel enregistré {"method":"JOB","path":"/jobs/d443d541-…","role":null,"userId":null,"body":"{\"items\":[\"a\",\"b\"],\"order\":42}"}.
Un travail s'exécute sans utilisateur : ne comptez pas sur x-aura-user-id. Si le travail appartient à un utilisateur, placez l'identifiant de l'utilisateur dans la charge utile.
3. Cycle de vie et tentatives
- Un travail exécute au moins une fois. Il peut s'exécuter deux fois si un travailleur s'arrête pendant son exécution, rendez donc la fonction idempotente.
- Une tentative échouée est réessayée après un délai fixe de 5 secondes, jusqu'à ce que
maxAttemptssoit atteint. Le travail est alorsdead. Le délai et le nombre de tentatives par défaut sont des paramètres de service (JOB_RETRY_DELAY_SECS,JOB_MAX_RETRIES). - Une tâche qui est toujours
runningaprès son bail (450 secondes par défaut) est récupérée par le service. - Les travaux terminés sont conservés pendant 14 jours par défaut.
Un job est completed dès que votre fonction répond, quel que soit le code d'état. Lors d'une exécution réelle, une fonction qui renvoyait 500 a produit une tâche completed après une tentative et n'a jamais été réessayée.
Une tâche échoue et est réessayée uniquement lorsque l'appel lui-même échoue : la fonction n'existe pas ou est inactive, le runtime est inaccessible ou l'appel expire. Si vous souhaitez réessayer lorsque votre propre code détecte une erreur, mettez en file d'attente une nouvelle tâche à partir du gestionnaire (avec delaySecs pour une interruption) au lieu de vous fier au code d'état.
Dans la même exécution réelle, une tâche pour une fonction qui n'existe pas a suivi cette séquence : la tentative 1 a échoué à 3 s avec Fonction 'ghost' introuvable, la tentative 2 a échoué à environ 9 s et la tâche est devenue dead avec attempts égal à max_attempts.
4. La file d'attente des lettres mortes
Les travaux morts restent dans la file d'attente et peuvent être répertoriés et réessayés. Ces routes n'ont pas encore de méthode SDK : utilisez HTTP avec une clé service_role.
Une nouvelle tentative remet le travail à pending sans réinitialiser son compteur de tentatives, il obtient donc exactement une tentative supplémentaire et revient à dead s'il échoue à nouveau. Corrigez la cause (déployez la fonction manquante, par exemple) avant de réessayer.
5. Planifiez avec cron
Une entrée cron n'appelle pas la fonction elle-même : chaque fois qu'elle se déclenche, elle met une tâche en file d'attente.
- Le planning comporte 5 champs (
min hour day month weekday) ou 6 champs (sec min hour day month weekday). Un programme à 5 champs obtient0secondes devant :*/1 * * * *est stocké sous0 */1 * * * *. - Les alias tels que
@dailysont refusés avec un400indiquant le format attendu. - Les heures sont en UTC.
last_runetnext_runsontnulljusqu'au premier tir. Dans une exécution réelle, un programme créé à 15h40 s'est déclenché à 15h41:00, puis a affichénext_run15:42:00.- La charge utile est gelée lorsque vous créez l'entrée.
- La suppression d'un nom inconnu renvoie
404. La suppression d'une entrée cron l'empêche également de se déclencher. - Le SDK n'a pas de
getCronJobouupdateCronJob: supprimez l'entrée et créez-la à nouveau.
Pour un travail purement base de données, l'extension Postgres pg_cron évite l'aller-retour vers une fonction : voir la page Cron.