Di dunia web modern, ada tugas yang lebih cepat diselesaikan secara paralel daripada satu per satu. Panggil tiga API sekaligus alih-alih menunggu satu per satu. Laravel 12 punya fitur Concurrency yang membuat ini mudah dilakukan.
Artikel ini menjelaskan apa itu Concurrency di Laravel 12, cara kerjanya, dan kapan sebaiknya dipakai.
Apa Itu Concurrency di Laravel 12?
Concurrency facade di Laravel 12 memungkinkan Anda menjalankan beberapa closure secara bersamaan (paralel) dan menunggu semua hasilnya. Ini berguna saat Anda punya beberapa operasi yang tidak bergantung satu sama lain dan masing-masing membutuhkan waktu, seperti memanggil beberapa API eksternal atau query ke database berbeda.
Tanpa concurrency (sequential):
// Total waktu: 1 + 2 + 1.5 = ~4.5 detik
$weather = fetchWeather($city); // 1 detik
$stock = fetchStockPrice($code); // 2 detik
$exchange = fetchExchangeRate(); // 1.5 detik
Dengan concurrency (paralel):
use IlluminateSupportFacadesConcurrency;
// Total waktu: ~2 detik (terlama)
[$weather, $stock, $exchange] = Concurrency::run([
fn() => fetchWeather($city),
fn() => fetchStockPrice($code),
fn() => fetchExchangeRate(),
]);
Bagaimana Cara Kerjanya?
Laravel Concurrency bekerja dengan membuka beberapa proses PHP secara paralel (bukan thread). Setiap closure dijalankan di child process terpisah, hasilnya di-serialize dan dikembalikan ke parent process.
Ini berbeda dengan async programming di Node.js atau Go. Laravel Concurrency tidak non-blocking event loop, melainkan multi-process. Artinya ada overhead untuk setiap proses baru, jadi tidak ideal untuk tugas yang sangat pendek (di bawah 100ms).
Contoh Penggunaan Nyata
Dashboard analytics yang perlu data dari beberapa sumber:
use IlluminateSupportFacadesConcurrency;
[$orders, $revenue, $topProducts, $visitors] = Concurrency::run([
fn() => Order::thisMonth()->count(),
fn() => Order::thisMonth()->sum('total'),
fn() => Product::topSelling(5)->get(),
fn() => Analytics::uniqueVisitors(today()),
]);
return view('dashboard', compact('orders', 'revenue', 'topProducts', 'visitors'));
Tanpa concurrency, kalau tiap query butuh 200ms, total jadi 800ms. Dengan concurrency, total sekitar 200ms (sesuai yang terlama).
Defer: Jalankan Setelah Response Dikirim
Laravel 12 juga punya Concurrency::defer() — mirip dengan concurrency, tapi closure dijalankan setelah response HTTP sudah dikirim ke browser.
use IlluminateSupportFacadesConcurrency;
// Response langsung dikirim ke user
// Tiga closure di bawah jalan di background
Concurrency::defer([
fn() => $this->updateLastLogin($user),
fn() => $this->logActivity($user, 'login'),
fn() => $this->syncWithCRM($user),
]);
return redirect()->intended('dashboard');
Berguna untuk aksi “fire and forget” yang tidak perlu hasilnya sebelum response dikirim.
Kapan Pakai, Kapan Tidak?
Cocok untuk:
- Beberapa panggilan API eksternal yang independent
- Query ke database berbeda (multi-connection) yang tidak saling bergantung
- Proses komputasi berat yang bisa diparalelkan
Tidak cocok untuk:
- Tugas sangat cepat (overhead proses lebih mahal daripada keuntungannya)
- Operasi yang saling bergantung (output A dibutuhkan input B)
- Operasi yang butuh akses ke state yang sama (tidak ada shared memory antar proses)
Baca Juga
- Contoh Implementasi Concurrency di Laravel 12: Studi Kasus Nyata
- Apa Itu Context di Laravel 12 dan Bagaimana Cara Kerjanya
Tertarik membangun aplikasi Laravel yang performa-nya dioptimalkan? Lihat layanan pengembangan aplikasi kami.
Leave a Reply