6 min de lecture
11 vues

Laravel 12.34 : Le Failover Queue Driver – Quand Redis Tombe, Laravel Continue Sans Faiblir

Laravel 12.34 : Le Failover Queue Driver – Quand Redis Tombe, Laravel Continue Sans Faiblir

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 sync pour une exécution immédiate),
  • Continue jusqu'à succès ou épuisement de la liste,
  • Déclenche un événement QueueFailedOver pour 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=default
php 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

  1. Dispatch d'un Job : Vous appelez dispatch(MyJob::class).
  2. Tentative Primaire : Laravel push le job vers redis.
  3. Détection d'Échec : Si Redis renvoie une exception (ex. : Connection refused), pas de panique.
  4. Basculement Automatique : Essai sur database. Succès ? Job sauvé !
  5. Événement Trigger : QueueFailedOver est émis avec détails (connexion échouée, job concerné).
  6. Fallback Ultime : Si tout rate, sync exé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.php
namespace 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.php
use 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.php
use 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/horizon
php artisan horizon:install
php 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.34
php artisan queue:table # Si DB pas encore configurée
php 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 (seulement push() et later()).

Use Cases Réels

  1. E-commerce : Panne SQS → fallback DB pour commander processing (millions d'€ en jeu).
  2. SaaS : Redis down → sync pour notifications critiques, DB pour batchs.
  3. Fintech : Multi-régions : Redis EU → DB US en cas de outage géo.
  4. 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 :