Sonsuz Döngü Hatası
Smart Tech Devs’de B2B SaaS platformlarında, müşteriler genellikle 100,000 satırdan oluşan müşteri kayıtları gibi büyük veri kümelerini yükleyerek sistemde yer almak isterler. Naif bir backend yaklaşımı, CSV’yi ayrıştırmak ve her bir satır için 100,000 ayrı arka plan işi başlatmak için basit bir foreach döngüsü kullanmaktır.
Bu durumda büyük bir operasyonel kör nokta oluşur. Örneğin, #45,000 işi hatalı bir e-posta adresi nedeniyle başarısız olursa, kullanıcıya nasıl bildirimde bulunursunuz? Yüklemenin genel ilerlemesini nasıl takip edersiniz? Tüm 100,000 iş tamamlandığında e-posta göndermeyi nasıl tetiklersiniz? Standart başlatma ile bu işler tamamen kopuk hale gelir. Büyük, uyumlu iş akışlarını yönetmek için Laravel Job Batching uygulamanız gerekir.
Çözüm: Bus::batch() Facade’ı
Laravel Job Batching, binlerce bağımsız işi tek bir, takip edilebilir varlık halinde gruplamanıza olanak tanır. Çatı, partiye benzersiz bir ID atar ve bu, frontend’in tam tamamlama yüzdesini sorgulamasına olanak tanır. Ayrıca, toplu işlemin genel başarı veya başarısızlığına göre mantık çalıştırmak için katı yaşam döngüsü kancaları (then, catch, finally) sağlar.
Adım 1: Batch Dispatcher’ı Mimarisi
CSV’yi bellek güvenli bir jeneratör kullanarak okuyoruz, verileri parçalara ayırıyoruz ve işlem işlerini birleştirilmiş bir partiye itiyoruz.
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Jobs\ProcessCsvRow;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Bus;
use Throwable;
class ImportController extends Controller
{
public function importCustomers(Request $request)
{
$tenantId = $request->user()->tenant_id;
$jobs = [];
// Varsayıma göre CSV'yi bellek güvenli parçalara ayırdık
foreach ($request->input('csv_rows') as $row) {
$jobs[] = new ProcessCsvRow($tenantId, $row);
}
// 1. İşleri tek bir takip edilebilir varlık olarak başlat
$batch = Bus::batch($jobs)
->allowFailures() // KRİTİK: Bir satır başarısız olursa tüm partiyi iptal etme!
->then(function (\Illuminate\Bus\Batch $batch) use ($tenantId) {
// 2. Yalnızca tüm işler %100 başarıyla tamamlandığında çalıştır
\Log::info("Tenant {$tenantId} import completed flawlessly.");
})
->catch(function (\Illuminate\Bus\Batch $batch, Throwable $e) {
// 3. Bir iş başarısız olduğunda ilk kez çalıştırılır
\Log::warning("Batch {$batch->id} encountered its first error.");
})
->finally(function (\Illuminate\Bus\Batch $batch) use ($tenantId) {
// 4. Tüm işler tamamlandığında, başarısızlıklar dahil
app('notification.service')->sendImportReport(
$tenantId,
$batch->processedJobs(),
$batch->failedJobs
);
})
->name('Customer_Import_Tenant_'.$tenantId)
->dispatch();
// 5. Gerçek zamanlı ilerleme çubuğu oluşturması için Batch ID'yi frontend'e döndür
return response()->json(['batch_id' => $batch->id]);
}
}
Adım 2: Frontend’de İlerleme Takibi
Laravel, parti durumunu veritabanında sakladığı için, React frontend’iniz temiz bir şekilde bir uç noktayı (örneğin, /api/batches/{id}) sorgulayabilir ve pürüzsüz bir 0-100% ilerleme çubuğu oluşturabilir. Bu, korkunç bir “kara kutu” arka plan işleminden premium bir kullanıcı deneyimine dönüşmeyi sağlar.
Mühendislik ROI
Job Batching’i kullanarak dağıtılmış yürütme üzerinde mutlak kontrol kazanırsınız. Sessiz kısmi hataları ortadan kaldırır, kullanıcılarınıza ilerleme takibi aracılığıyla tam şeffaflık sağlarsınız ve işleme sonrasında mantık (özet e-posta göndermek veya defter toplamlarını güncellemek gibi) yalnızca hesaplama süreci tamamen bittiğinde çalıştırılmasını garanti edersiniz.
Kaynak: Orijinal Makale


