feat: Messaging asynchrone fiable avec retry, dead-letter et métriques

Les événements métier (emails d'invitation, reset password, activation)
bloquaient la réponse API en étant traités de manière synchrone. Ce commit
route ces événements vers un transport AMQP asynchrone avec un worker
dédié, garantissant des réponses API rapides et une gestion robuste des
échecs.

Le retry utilise une stratégie Fibonacci (1s, 1s, 2s, 3s, 5s, 8s, 13s)
qui offre un bon compromis entre réactivité et protection des services
externes. Les messages qui épuisent leurs tentatives arrivent dans une
dead-letter queue Doctrine avec alerte email à l'admin.

La commande console CreateTestActivationTokenCommand détecte désormais
les comptes déjà actifs et génère un token de réinitialisation de mot
de passe au lieu d'un token d'activation, évitant une erreur bloquante
lors de la ré-invitation par un admin.
This commit is contained in:
2026-02-08 21:38:20 +01:00
parent 4005c70082
commit 9ccad77bf0
29 changed files with 1706 additions and 33 deletions

View File

@@ -182,6 +182,45 @@ services:
start_period: 10s
restart: unless-stopped
# =============================================================================
# ASYNC WORKER - Symfony Messenger
# =============================================================================
worker:
build:
context: ./backend
dockerfile: Dockerfile
target: dev
container_name: classeo_worker
env_file:
- ./backend/.env
environment:
APP_ENV: ${APP_ENV:-dev}
DATABASE_URL: postgresql://classeo:classeo@db:5432/classeo_master?serverVersion=18&charset=utf8
REDIS_URL: redis://redis:6379
MESSENGER_TRANSPORT_DSN: amqp://guest:guest@rabbitmq:5672/%2f/messages
MERCURE_URL: http://mercure/.well-known/mercure
MEILISEARCH_URL: http://meilisearch:7700
MAILER_DSN: ${MAILER_DSN:-smtp://mailpit:1025}
command: php bin/console messenger:consume async --time-limit=3600 --memory-limit=128M -vv
volumes:
- ./backend:/app:cached
depends_on:
rabbitmq:
condition: service_healthy
php:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "ps aux | grep 'messenger:consume' | grep -v grep"]
interval: 30s
timeout: 5s
retries: 3
start_period: 30s
deploy:
resources:
limits:
memory: 256M
restart: unless-stopped
# =============================================================================
# EMAIL TESTING - Mailpit
# =============================================================================