100,000 Satırlık Kabus
<p>B2B SaaS platformlarında, büyük veri işleme vazgeçilmez bir özelliktir. Kurumsal müşteriler, müşteri kayıtları, envanter veya geçmiş veriler içeren 100.000 satırlık CSV dosyaları yükleyecektir. Bu veriyi HTTP kontrolörü içinde senkron olarak parse etmeye çalıştığınızda, PHP zaman aşımına uğrayabilir, sunucu 502 Bad Gateway hatası verebilir ve kullanıcı hayal kırıklığına uğrayabilir.</p>
<p>Zaman aşımının çözümünü zaten biliyorsunuz: İşi arka plana taşıyın ve Laravel Queues kullanın. Ancak, kuyruklar yeni bir mimari problem getirir. CSV'yi parçalamak ve 1.000 ayrı arka plan görevi göndermek isterseniz, tüm sürecin ne zaman tamamlandığını nasıl bileceksiniz? Kullanıcıya nasıl bildireceksiniz? İş #450 başarısız olursa, diğerleri başarıyla geçerse ne yapacaksınız? Cevap <strong>Laravel Job Batching</strong>.</p>
<h2>Kurumsal Çözüm: `Bus::batch()`</h2>
<p>Job Batching, büyük bir dizi bireysel görevi bir araya getirmenizi, bunları kuyruk işçileriniz için eşzamanlı olarak göndermenizi ve tüm grubun tamamlandığında, ilk başarısızlığıyla karşılaştığında veya durumuna bakılmaksızın sona erdiğinde yalnızca çalışan net geri çağırmaları tanımlamanızı sağlar.</p>
<h3>Adım 1: İçe Aktarma Kontrolörünü Tasarlamak</h3>
<p>CSV'yi döngüye sokup kayıtları doğrudan kaydetmek yerine, CSV'yi okuyup daha küçük dizilere (örneğin, parça başına 500 satır) böleriz ve bir <code>ProcessCsvChunk</code> işini bir diziye ekleriz. Daha sonra grubu göndeririz.</p>
<pre><code>namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Bus;
use App\Jobs\ProcessCsvChunk;
use Throwable;
class ImportController extends Controller
{
public function importCustomers(Request $request)
{
// 1. CSV verisini oku ve parçalara ayır (bir yardımcı fonksiyon varsayıyoruz)
$chunks = $this->getCsvDataInChunks($request->file(‘import’), 500);
$jobs = [];
foreach ($chunks as $chunk) {
$jobs[] = new ProcessCsvChunk($chunk, $request->user()->tenant_id);
}
// 2. Grubu gönder
$batch = Bus::batch($jobs)->then(function (Bus\Batch $batch) {
// Tüm görevler başarıyla tamamlandı
// Örneğin, bir e-posta gönder veya bir WebSocket olayı yay
\Log::info("Import Batch {$batch->id} sorunsuz tamamlandı.");
})->catch(function (Bus\Batch $batch, Throwable $e) {
// İlk grup iş başarısızlığı tespit edildi
\Log::error("Import Batch {$batch->id} başarısız oldu: " . $e->getMessage());
})->finally(function (Bus\Batch $batch) {
// Grup çalışması (başarılı veya başarısız) sona erdi
\Log::info("Batch {$batch->id} yürütmesi tamamlandı.");
})->name('Enterprise Customer Import')->dispatch();
// 3. Hemen batch ID'sini ön uca döndür
return response()->json([
'status' => 'processing',
'batch_id' => $batch->id
]);
}}
<h3>Adım 2: Ön Uçta İlerlemeyi Anketleme</h3>
<p>Kontrolör, <code>batch_id</code>'sini hemen döndürdüğü için, React veya Next.js ön uçlarınız bunu kullanarak basit bir uç noktayı anketleyebilir (veya bir yayını dinleyebilir) ve kullanıcıya canlı bir ilerleme çubuğu gösterebilir. Laravel, toplam görevler ile işlenmiş görevler arasındaki farka dayanarak bu ilerlemeyi otomatik olarak hesaplar.</p>
<pre><code>// Batch durumunu kontrol etmek için basit bir route
Route::get(‘/batch/{batchId}’, function (string $batchId) {
return Bus::findBatch($batchId);
});
<h2>Mühendislik ROI'si</h2>
<p>Job Batching uygulaması, kırılgan ve çökme riski taşıyan bir uç noktayı kurumsal düzeyde bir veri boru hattına dönüştürür. Veri alımını çok daha hızlı hale getirmek için aynı anda birden fazla kuyruk işçisini kullanmanıza olanak tanır, kutudan çıkışta gerçek zamanlı ilerleme takibi sağlar ve karmaşık başarı/başarısızlık döngüleri üzerinde tam programatik kontrol sunar.</p>Kaynak: Orijinal Makale


