Aller au contenu

Runbook: Déblocage queue saturée

PD-3 CA-05 | Temps max: 15 min | Prérequis: Accès SSH


Prérequis

  • Accès SSH au serveur backend
  • Accès Redis CLI
  • Mot de passe Redis (Vault: kv/infra/redis)

Diagnostic

1. Identifier la queue saturée

redis-cli -a $REDIS_PASSWORD LLEN bull:default:wait
redis-cli -a $REDIS_PASSWORD LLEN bull:backup:wait
redis-cli -a $REDIS_PASSWORD LLEN bull:export:wait
redis-cli -a $REDIS_PASSWORD LLEN bull:blockchain:wait

Seuil d'alerte: > 1000 jobs en attente

2. Vérifier les jobs actifs (bloqués?)

redis-cli -a $REDIS_PASSWORD LLEN bull:default:active

Problème potentiel: Jobs actifs depuis longtemps (stalled)

3. Vérifier les workers

sudo systemctl status probatiovault-backend
sudo journalctl -u probatiovault-backend -n 50 --no-pager | grep -i "worker\|job\|bull"

Résolution

Scénario A: Workers arrêtés

Étape 1: Redémarrer le backend

sudo systemctl restart probatiovault-backend

Étape 2: Vérifier la reprise

watch -n 2 'redis-cli -a $REDIS_PASSWORD LLEN bull:default:wait'

Résultat attendu: Queue length diminue progressivement

Scénario B: Jobs stalled (bloqués)

Étape 1: Identifier les jobs stalled

redis-cli -a $REDIS_PASSWORD ZRANGEBYSCORE bull:default:stalled-check 0 +inf

Étape 2: Forcer le retraitement des jobs stalled

# Via l'API backend (méthode recommandée)
curl -X POST http://localhost:3000/jobs/process-stalled

Scénario C: Queue flood (trop de jobs soumis)

Étape 1: Activer le throttling (si disponible)

# Configurer rate limit temporaire
curl -X POST http://localhost:3000/admin/queue/throttle \
  -H "Content-Type: application/json" \
  -d '{"queue": "default", "maxPerMinute": 100}'

Étape 2: Purger les jobs obsolètes (avec précaution)

# Dry run d'abord
curl "http://localhost:3000/jobs/purge?target=redis&olderThan=1h&dryRun=true"

# Purge réelle si nécessaire
curl -X DELETE "http://localhost:3000/jobs/purge?target=redis&olderThan=1h"

Vérification

1. Queue length sous le seuil

redis-cli -a $REDIS_PASSWORD LLEN bull:default:wait

Résultat attendu: < 1000 jobs

2. Jobs en cours de traitement

redis-cli -a $REDIS_PASSWORD LLEN bull:default:active

Résultat attendu: > 0 (workers actifs)

3. Vérifier via API

curl -s http://localhost:3000/jobs/stats | jq .

Résultat attendu: pending diminue, succeeded augmente


Rollback

Si la situation empire:

1. Arrêter la soumission de nouveaux jobs

# Mettre le backend en mode maintenance
curl -X POST http://localhost:3000/admin/maintenance/enable

2. Analyser les causes root

# Logs détaillés
sudo journalctl -u probatiovault-backend --since "1 hour ago" | grep -E "ERROR|WARN|failed"

3. Contacter l'équipe dev si nécessaire


Critère de succès

  • Queue length < 1000 jobs
  • Workers actifs (jobs en cours de traitement)
  • Pas de jobs stalled
  • API /jobs/stats montre une progression normale

Références

  • PD-3-specification.md: INV-01 (pas de perte), INV-02 (observabilité)
  • PD-3-plan.md: Section 6 (QUEUE_FULL)
  • TC-NEG-02: Échec massif de tâches