Aller au contenu

Réessais et inspection

Objectif : réessayer une tâche qui échoue et suivre son état.

Ce que vous allez apprendre : max_attempts fixe le nombre d'essais d'une tâche.
Si le gestionnaire lève une erreur et qu'il reste des essais, la tâche est remise en file ; sinon elle passe en failed.
On inspecte l'état d'une tâche avec get_job et le nombre de tâches en attente avec pending_count.

Deuxième palier du niveau intermédiaire de la progression Jobs.

Ce que ce starter montre

  • enfiler une tâche avec plusieurs essais via max_attempts ;
  • inspecter l'état d'une tâche avec get_job et la file avec pending_count.

Fonctions Forge utilisées

Fonction Rôle dans ce starter Référence
enqueue(task, payload, max_attempts=...) Enfile une tâche avec un nombre d'essais. Opt-ins
get_job(job_id) Renvoie l'état d'une tâche (Job) ou None. Opt-ins
pending_count() Nombre de tâches en attente. Opt-ins

1. Enfiler avec des réessais

from forge_mvc_jobs import enqueue, get_job, pending_count

job_id = enqueue("rapport.genere", {"client": 42}, max_attempts=3)

print("en attente :", pending_count())

Comprendre ce code

  • max_attempts=3 autorise jusqu'à trois essais pour cette tâche.
  • Si le gestionnaire lève une erreur et qu'il reste des essais, la tâche est remise en file.
  • Une fois les essais épuisés, la tâche passe en statut failed.
  • Une tâche sans gestionnaire associé est directement marquée failed.
  • pending_count() indique combien de tâches attendent encore d'être traitées.

Le réessai attend, il n'est pas immédiat

Une tâche remise en file n'est pas reprise tout de suite.
Elle attend un délai qui double à chaque tentative, soit 10, 20, 40, 80, 160, 320, puis 600 secondes au plus.

Ne vous étonnez donc pas de voir la tâche rester pending après un échec, sans qu'un nouvel essai parte : c'est le délai qui court, pas une panne.

Sans ce délai, une tâche qui échoue vite consommait ses trois essais en une fraction de seconde, ce qui ne laissait aucune chance à une panne passagère de se résorber.

2. Suivre l'état d'une tâche

job = get_job(job_id)
if job is not None:
    print(job.status, job.attempts, "/", job.max_attempts)
    if job.status == "failed":
        print("dernière erreur :", job.last_error)

Comprendre ce code

  • get_job(job_id) renvoie un objet Job figé, ou None si l'identifiant est inconnu.
  • job.status vaut pending, running, done ou failed.
  • job.attempts compte les essais déjà consommés ; job.max_attempts est la limite.
  • job.last_error contient le message du dernier échec, utile pour diagnostiquer.

À retenir

  • max_attempts fixe le nombre d'essais ; l'échec remet en file tant qu'il en reste.
  • Le réessai attend un délai croissant, de 10 à 600 secondes : une tâche pending après un échec est normale.
  • Un worker tué laisse sa tâche en running ; forge jobs:reclaim la reprend, voir la page de référence.
  • get_job(id) donne l'état complet d'une tâche (status, attempts, last_error).
  • pending_count() mesure la charge restante de la file.

Après ce starter

Vous savez gérer les échecs et suivre les tâches.
Reste à ordonner la file, et à ne rien perdre en vol.

Suivant : priorité et idempotence