Uzun Süreli İstek Problemi
Uygulamanızın 10,000 kullanıcı için ay sonu finansal raporları oluşturması gerektiğini hayal edin. Eğer bunu bir HTTP kontrolcüsü içinde senkron olarak işlemeye çalışırsanız, sunucu zaman aşımına uğrayacak ve kullanıcı bozuk bir sayfa ile karşılaşacak, raporların yarısı ise oluşturulmamış kalacaktır. Standart bir kuyruğa göndermek bile 10,000 raporun tamamının ne zaman bittiğini takip etmek açısından oldukça zordur.
Smart Tech Devs olarak, büyük ve kaynak yoğun iş akışlarını Laravel Job Batching kullanarak yönetiyoruz. Bu, binlerce asenkron işi bir araya getirip, paralel olarak işlememizi ve tüm küme tamamlandığında geri çağırmaları gerçekleştirmemizi sağlıyor.
Job Batching Kullanımı
İşleri körü körüne göndermek yerine, job batching size bir takip kimliği sağlar. Bu, frontend’in kullanıcıya gerçek zamanlı bir ilerleme çubuğu göstermesine olanak tanır.
Adım 1: Kümenin Gönderilmesi
Bus::batch() facade’ını kullanarak işlerinizi bir dizi haline getiriyoruz ve küme başarılı olduğunda, başarısız olduğunda veya tamamen tamamlandığında ne olacağını tanımlıyoruz.
use App\Jobs\GenerateMonthlyReport;
use Illuminate\Support\Facades\Bus;
use Throwable;
$users = User::active()->pluck('id');
$jobs = $users->map(fn($id) => new GenerateMonthlyReport($id))->toArray();
$batch = Bus::batch($jobs)->then(function (Batch $batch) {
// Tüm işler başarıyla tamamlandı
Notification::route('mail', '[email protected]')
->notify(new ReportsCompletedNotification());
})->catch(function (Batch $batch, Throwable $e) {
// İlk batch iş hatası tespit edildi
Log::error('Batch işleme hatası: ' . $e->getMessage());
})->finally(function (Batch $batch) {
// Küme tamamlandığında (başarı/hata fark etmez) yürütülür
})->name('Aylık Finansal Raporlar')->dispatch();
// İlerleme takibi için küme ID'sini frontend'e döndür
return response()->json(['batch_id' => $batch->id]);
Adım 2: Bireysel İşin İşlenmesi
Bireysel iş sınıfı içinde Batchable trait’ini kullanıyoruz. Eğer belirli bir kullanıcının raporu başarısız olursa, işi başarısız olarak işaretleyebiliriz; bu da kümenin catch geri çağırmasını tetikler.
namespace App\Jobs;
use Illuminate\Bus\Batchable;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
class GenerateMonthlyReport implements ShouldQueue
{
use Batchable, Queueable;
public function __construct(public int $userId) {}
public function handle()
{
if ($this->batch()->cancelled()) {
// Kümenin iptal edilip edilmediğini belirleyin...
return;
}
// Yoğun işlem mantığı burada...
}
}
Mühendislik ROI’si
Job Batching uygulayarak, kırılgan ve zaman aşımına uğramaya yatkın uç noktaları sağlam, yüksek ölçeklenebilir arka plan süreçlerine dönüştürüyorsunuz. Birden fazla kuyruğa çalışan arasında görevleri paralel olarak işleyebilme, kısmi hataları düzgün bir şekilde ele alabilme ve kullanıcılara şeffaf, gerçek zamanlı ilerleme takibi sunma yeteneği kazanıyorsunuz.
Kaynak: Orijinal Makale


