5 min de lecture
16 vues

Laravel 12.34 : Les Deferred Batches, une Révolution pour le Traitement Asynchrone

Laravel 12.34 : Les Deferred Batches, une Révolution pour le Traitement Asynchrone

Laravel 12.34 a introduit l’une des fonctionnalités les plus attendues de l’année : les Deferred Batches, tant pour les requêtes HTTP que pour les files d’attente. Derrière ce nom technique se cache une révolution dans la gestion des tâches asynchrones lourdes : exécuter des dizaines, voire des centaines de requêtes ou de jobs sans bloquer l’utilisateur, avec un suivi précis des progrès, des succès et des échecs.

Cette nouveauté, portée par Wendell Adriel et validée par Taylor Otwell, est déjà saluée comme "le meilleur ajout à Laravel depuis les queues" par la communauté sur X. Plongeons dans les détails techniques, avec un exemple complet et une explication pas à pas.


Qu’est-ce que les Deferred Batches ?

Un Deferred Batch est un lot de tâches (HTTP ou jobs) qui :

  • S’exécute en arrière-plan (via une file d’attente),
  • Ne bloque jamais la réponse HTTP principale,
  • Permet de suivre en temps réel :
    • Le nombre de tâches terminées,
    • Les échecs,
    • La progression globale,
  • Offre des callbacks personnalisés sur then, catch, finally.

Avant : Vous deviez gérer manuellement les jobs, les progress bars, les retries…
Maintenant : Laravel fait tout ça en une seule méthode.


1. Http::batch() – Des Requêtes HTTP en Lot, Différées

Cas d’usage classique
Vous devez appeler 50 API externes (Stripe, GitHub, CRM, etc.) pour synchroniser des données utilisateur.
Problème : 50 appels synchrones = 10+ secondes de latence → timeout ou UX dégradée.
Solution : Http::batch() + file d’attente.

Exemple Complet

use Illuminate\Support\Facades\Http;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;
 
// Dans un contrôleur ou un job
public function syncExternalApis()
{
$batch = Http::batch([
// ... 47 autres requêtes
])->dispatch(); // ← Différé dans la queue !
 
// Sauvegarder l'ID du batch pour suivi
session()->put('sync_batch_id', $batch->id);
 
return redirect()->route('sync.status')
->with('message', 'Synchronisation lancée en arrière-plan...');
}

Suivi de la progression (dans une vue ou API)

// routes/web.php
Route::get('/sync/status', function () {
$batchId = session('sync_batch_id');
 
$batch = Bus::findBatch($batchId);
 
if ($batch->finished()) {
return "Terminé ! {$batch->processedRequests()} / {$batch->totalRequests} réussies.";
}
 
return "En cours... {$batch->processedPercentage()}%";
});

Callbacks Puissants

Http::batch([...])
->then(function (Batch $batch) {
// Toutes les requêtes ont réussi
Log::info('Sync complet !', ['processed' => $batch->processedRequests()]);
})
->catch(function (Batch $batch, Throwable $e) {
// Au moins une a échoué
Notification::send(Admin::all(), new SyncFailed($batch));
})
->finally(function (Batch $batch) {
// Nettoyage, envoi d'email, etc.
cache()->forget('sync_in_progress');
})
->dispatch();

2. Deferred Queues – Jobs Différés en Batch

Même principe, mais pour n’importe quel job Laravel.

Exemple : Traitement de 1000 PDFs

use Illuminate\Support\Facades\Bus;
use App\Jobs\GeneratePdfReport;
 
$batch = Bus::batch([
new GeneratePdfReport($user1),
new GeneratePdfReport($user2),
// ... 998 autres
])->then(function (Batch $batch) {
// Tous les PDFs sont générés
Mail::to('[email protected]')->send(new ReportsReady());
})->catch(function (Batch $batch, Throwable $e) {
// Un job a échoué → retry ou alerte
retryFailedJobs($batch);
})->dispatch();

Priorité et Délai

Bus::batch([...])
->priority(10) // Priorité dans la queue
->delay(now()->addMinutes(5)) // Démarrer dans 5 min
->dispatch();

Fonctionnalités Clés des Deferred Batches

Fonctionnalité Description
dispatch() Envoie le batch dans la queue (asynchrone)
then(), catch(), finally() Callbacks sur succès/échec/complétion
progress() Pourcentage en temps réel
allowFailures() Continue même si une tâche échoue
name('Sync Users') Nom pour debugging dans Horizon
onQueue('high') File d’attente dédiée

Intégration avec Laravel Horizon (Dashboard)

Dans Horizon, vous verrez :

  • Un onglet Batches,
  • Progression en temps réel,
  • Boutons Retry, Cancel, Delete,
  • Graphiques de performance.
php artisan horizon

Pourquoi c’est une Révolution ?

Avant (Laravel 11) Après (Laravel 12.34)
Http::pool() → synchrone ou limité Http::batch() → 100+ appels asynchrones
Jobs manuels + progress bars custom Batch natif avec callbacks
Pas de suivi centralisé Horizon + Bus::findBatch()
Risque de timeout Zéro impact sur la réponse HTTP

Mise à Jour & Compatibilité

composer require laravel/framework:^12.34

Aucun breaking change. Fonctionne avec Redis, SQS, Database, Beanstalkd.
Assurez-vous que votre driver de queue supporte les batches (tous les drivers officiels le font).


Use Cases Réels

  • Synchronisation CRM → 500 appels API → 3 secondes au lieu de 45.
  • Génération de rapports mensuels → 10 000 jobs → suivi en dashboard.
  • Import CSV massif → chunk par chunk, avec progression live.
  • Webhooks en masse → retry automatique sur échec.

Conclusion

Avec Deferred Batches, Laravel 12.34 transforme une tâche complexe (gérer des centaines d’opérations asynchrones) en quelques lignes de code élégantes.

Taylor Otwell sur X :
"Deferred HTTP Batches & Queues – this is the cool stuff that shipped in the last two weeks."
→ 600+ likes, 120 retweets.

À vous de jouer : testez Http::batch()->dispatch() dans votre prochain projet. Votre utilisateur ne verra plus jamais une page qui charge…

Liens utiles :