Dans un monde où les pannes de services cloud comme Redis ou SQS peuvent transformer une application robuste en chaos silencieux, Laravel 12.34 introduit le Failover Queue Driver. Cette fonctionnalité, imaginée et implémentée par Taylor Otwell lui-même, permet à vos jobs de queue de rebondir automatiquement vers un driver de backup si le principal flanche. Plus de jobs perdus, plus d'alertes paniquées à 3h du matin : Laravel gère le failover en toute transparence.
Annoncée le 14 octobre 2025 via un tweet viral de Taylor – "Today's Laravel release introduced a new 'failover' queue driver. It's now super easy to failover to executing jobs synchronously if your primary queue driver is down" – cette feature a déjà conquis la communauté avec plus de 450 likes et 60 reposts. Inspiré par des idées anciennes (comme ce ticket GitHub de 2016), c'est le remède ultime contre les interruptions. Plongeons dans les détails techniques, avec un exemple complet et une explication pas à pas.
Qu’est-ce que le Failover Queue Driver ?
Le Failover Queue Driver est un wrapper intelligent autour de plusieurs connexions de queue. Il :
- Tente d'abord le driver principal (ex. : Redis pour la vitesse),
- Si ça échoue (timeout, panne, surcharge), bascule automatiquement vers le suivant (ex. : base de données, ou même
syncpour une exécution immédiate), - Continue jusqu'à succès ou épuisement de la liste,
- Déclenche un événement
QueueFailedOverpour logger ou alerter sur le basculement.
Avant : Une panne Redis = jobs bloqués ou perdus, workers en panique.
Maintenant :QUEUE_CONNECTION=failover= résilience intégrée, zéro intervention manuelle.
C'est particulièrement puissant en production : imaginez un pic de trafic Black Friday où Redis surchauffe – vos emails transactionnels ou traitements batchs continuent via la DB sans que l'utilisateur ne s'en rende compte.
1. Configuration : Simple comme Bonjour
Dans config/queue.php
Ajoutez une connexion failover qui liste vos drivers en ordre de priorité :
'connections' => [ // Vos drivers existants 'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => env('REDIS_QUEUE', 'default'), 'retry_after' => 90, 'block_for' => null, ], 'database' => [ 'driver' => 'database', 'table' => 'jobs', 'queue' => 'default', 'retry_after' => 90, 'after_commit' => false, ], 'sync' => [ 'driver' => 'sync', ], // La magie : le failover 'failover' => [ 'driver' => 'failover', 'connections' => [ 'redis', // Premier choix : rapide et scalable 'database', // Backup : persistant et fiable 'sync', // Dernier recours : synchrone, sans worker ], ],],
Dans .env
Définissez-le comme default :
QUEUE_CONNECTION=failover
Workers : Un par Connexion
Lancez des workers pour chaque driver (sauf sync, qui n'en a pas besoin) :
php artisan queue:work redis --queue=defaultphp artisan queue:work database --queue=default
Astuce : Avec Laravel Horizon, monitorez tout en un dashboard unifié. Les workers non-Redis (comme
database) nécessitent des processus séparés.
2. Comment Ça Marche ? Le Mécanisme Étape par Étape
- Dispatch d'un Job : Vous appelez
dispatch(MyJob::class). - Tentative Primaire : Laravel push le job vers
redis. - Détection d'Échec : Si Redis renvoie une exception (ex. :
Connection refused), pas de panique. - Basculement Automatique : Essai sur
database. Succès ? Job sauvé ! - Événement Trigger :
QueueFailedOverest émis avec détails (connexion échouée, job concerné). - Fallback Ultime : Si tout rate,
syncexécute le job immédiatement dans le processus courant (mais attention : ça peut ralentir la réponse HTTP).
Exemple Complet : Gérer une Panne Redis
Imaginons un job SendWelcomeEmail qui envoie un email de bienvenue.
// app/Jobs/SendWelcomeEmail.phpnamespace App\Jobs; use Illuminate\Bus\Queueable;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Foundation\Bus\Dispatchable;use Illuminate\Queue\InteractsWithQueue;use Illuminate\Queue\SerializesModels;use Illuminate\Support\Facades\Mail; class SendWelcomeEmail implements ShouldQueue{ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public function __construct(public $user) {} public function handle(): void { Mail::to($this->user->email)->send(new \App\Mail\WelcomeMail($this->user)); }}
Dispatch dans un Contrôleur
// app/Http/Controllers/AuthController.phpuse App\Jobs\SendWelcomeEmail; public function register(Request $request){ // ... création user ... // Dispatch avec failover automatique SendWelcomeEmail::dispatch($user); return response()->json(['message' => 'Inscription réussie ! Email en cours...']);}
Si Redis est down :
- Le job atterrit en DB → traité par le worker
database. - L'utilisateur voit une réponse instantanée, sans timeout.
Écouter l'Événement pour Alerter
// app/Providers/EventServiceProvider.phpuse Illuminate\Queue\Events\QueueFailedOver;use Illuminate\Support\Facades\Event; Event::listen(QueueFailedOver::class, function (QueueFailedOver $event) { \Log::warning('Failover activé !', [ 'from_connection' => $event->fromConnection, 'job' => $event->job->resolveName(), ]); // Optionnel : Slack ou email admin // \Illuminate\Support\Facades\Notification::route('slack', 'channel')->notify(new QueueFailoverAlert($event));});
Fonctionnalités Clés du Failover Queue Driver
| Fonctionnalité | Description |
|---|---|
connections array |
Liste prioritaire des drivers à tester (Redis → DB → Sync). |
QueueFailedOver event |
Hook pour logging/alertes sur basculement. |
| Support multi-drivers | Redis, SQS, Database, Beanstalkd, etc. |
| Pas de retry automatique | Basculement immédiat ; si tous échouent, exception levée. |
| Compatible Horizon | Monitoring unifié, mais workers séparés. |
deferred comme fallback |
Nouveau en 12.35 : exécution post-réponse HTTP sans bloquer. |
Intégration avec Laravel Horizon (Dashboard)
Installez Horizon pour visualiser les failovers :
composer require laravel/horizonphp artisan horizon:installphp artisan horizon
Dans l'interface :
- Metrics : Taux de failovers par connexion.
- Failed Jobs : Jobs impactés, avec raison (ex. : "Redis down").
- Tags : Marquez les jobs pour tracer les basculements.
Pourquoi c’est une Révolution pour la Résilience ?
| Avant (Laravel 11) | Après (Laravel 12.34) |
|---|---|
| Panne Redis = jobs perdus ou manuels | Auto-failover vers DB/sync en <1s |
| Config manuelle pour backups | Un array connections suffit |
| Pas d'événement natif | QueueFailedOver pour monitoring pro |
| Workers bloqués sur une connexion | Workers indépendants, jobs redirigés |
| Risque de downtime total | Uptime 99.99% sans effort |
Taylor l'a prototypé en une matinée le 10 octobre, suite à des idées communautaires datant de 2016. Résultat : un système "set it and forget it" qui sauve des millions de jobs par jour en prod.
Mise à Jour & Compatibilité
composer require laravel/framework:^12.34php artisan queue:table # Si DB pas encore configuréephp artisan migrate
Aucun breaking change. Fonctionne avec tous les drivers officiels. Testez en staging : simulez une panne Redis avec
docker stop redis.
Limitations :
- Failover au push seulement (pas au drain des workers).
- Si tous les drivers échouent, le job lève une exception.
pushRaw()ne trigger pas l'événement (seulementpush()etlater()).
Use Cases Réels
- E-commerce : Panne SQS → fallback DB pour commander processing (millions d'€ en jeu).
- SaaS : Redis down → sync pour notifications critiques, DB pour batchs.
- Fintech : Multi-régions : Redis EU → DB US en cas de outage géo.
- API Heavy : 10k jobs/heure → failover transparent, zéro perte.
Conclusion
Le Failover Queue Driver transforme Laravel en une forteresse imprenable contre les pannes de queue. Comme le dit Taylor : "super easy to failover" – et c'est vrai. Plus de sueurs froides quand Redis tousse : vos jobs continuent, votre app respire.
Taylor Otwell sur X :
"If your main queue connection is down you can failover to a backup connection, even 'sync'. Thoughts? 🫶"
→ 226 likes, buzz immédiat.
À vous de jouer : Ajoutez 'failover' à votre config/queue.php et dormez tranquille. La résilience n'a jamais été aussi simple.
Liens utiles :
WAFFO LELE ROSTAND