Contoh Penggunaan Concurrency di Laravel 12: Dashboard, API Paralel, dan Defer
Artikel sebelumnya membahas konsep Concurrency di Laravel 12. Artikel ini fokus pada implementasi: studi kasus nyata bagaimana Concurrency bisa mempercepat aplikasi secara signifikan.
Studi Kasus 1: Dashboard dengan Banyak Data Source
Dashboard admin yang butuh data dari beberapa tabel berbeda. Ini biasanya jadi bottleneck karena diquery satu per satu.
Sebelum (sequential — sekitar 800ms):
public function dashboard()
{
$totalOrders = Order::thisMonth()->count(); // ~200ms
$totalRevenue = Order::thisMonth()->sum('total'); // ~200ms
$pendingOrders = Order::where('status', 'pending')->count(); // ~150ms
$newCustomers = User::thisMonth()->count(); // ~150ms
$topProducts = Product::topSelling(5)->get(); // ~100ms
return view('dashboard', compact(...));
}
Sesudah (paralel — sekitar 200ms):
use IlluminateSupportFacadesConcurrency;
public function dashboard()
{
[$totalOrders, $totalRevenue, $pendingOrders, $newCustomers, $topProducts] =
Concurrency::run([
fn() => Order::thisMonth()->count(),
fn() => Order::thisMonth()->sum('total'),
fn() => Order::where('status', 'pending')->count(),
fn() => User::thisMonth()->count(),
fn() => Product::topSelling(5)->get(),
]);
return view('dashboard', compact(
'totalOrders', 'totalRevenue', 'pendingOrders', 'newCustomers', 'topProducts'
));
}
Studi Kasus 2: Multiple API Calls
Halaman product detail yang butuh data dari beberapa API eksternal:
use IlluminateSupportFacadesConcurrency;
public function productDetail(Product $product): View
{
[$reviews, $stock, $shippingOptions] = Concurrency::run([
fn() => $this->reviewApi->getProductReviews($product->id), // API 1
fn() => $this->inventoryApi->getStock($product->sku), // API 2
fn() => $this->shippingApi->getOptions($product->weight), // API 3
]);
return view('products.detail', compact('product', 'reviews', 'stock', 'shippingOptions'));
}
Kalau masing-masing API butuh 500ms, tanpa concurrency total 1.5 detik. Dengan concurrency, cukup ~500ms.
Studi Kasus 3: Defer untuk Aksi Non-Blocking
User logout — beberapa aksi perlu terjadi tapi tidak perlu selesai sebelum response dikirim:
use IlluminateSupportFacadesConcurrency;
public function logout(Request $request): RedirectResponse
{
$user = $request->user();
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
// Jalankan setelah response dikirim
Concurrency::defer([
fn() => $this->activityLog->record($user, 'logout'),
fn() => $this->deviceTokenService->revokeAll($user),
fn() => $this->sessionCleanup->cleanup($user),
]);
return redirect('/');
}
Studi Kasus 4: Generate Laporan Parallel
Generate beberapa bagian laporan sekaligus lalu gabungkan:
public function generateAnnualReport(int $year): array
{
[$salesData, $customerData, $productData, $regionData] = Concurrency::run([
fn() => $this->salesReport->compile($year),
fn() => $this->customerReport->compile($year),
fn() => $this->productReport->compile($year),
fn() => $this->regionReport->compile($year),
]);
return [
'year' => $year,
'sales' => $salesData,
'customers' => $customerData,
'products' => $productData,
'regions' => $regionData,
'generated_at' => now()->toIso8601String(),
];
}
Error Handling di Concurrency
Kalau salah satu closure melempar exception, Concurrency akan meneruskan exception tersebut:
use IlluminateSupportFacadesConcurrency;
try {
[$data1, $data2] = Concurrency::run([
fn() => riskyApiCall(),
fn() => anotherApiCall(),
]);
} catch (Exception $e) {
// Handle error — biasanya fallback ke data cached atau default
Log::warning("Concurrency error: {$e->getMessage()}");
[$data1, $data2] = [getFromCache('data1'), getFromCache('data2')];
}
Kapan Tidak Pakai Concurrency
Jangan pakai untuk operasi yang sangat cepat. Overhead membuka child process (~50-100ms) lebih mahal dari manfaatnya kalau setiap closure selesai dalam 5ms.
Gunakan untuk operasi yang masing-masing butuh 100ms ke atas, terutama I/O seperti HTTP request, query database, atau baca file besar.
Baca Juga
Butuh tim yang bantu optimasi performa aplikasi Laravel Anda? Lihat layanan pengembangan aplikasi kami.
Artikel Lainnya di Kategori Laravel
Laravel 9 November 2025
Routing di Laravel: Panduan Lengkap dengan Contoh Kode
Routing adalah pintu masuk semua request di Laravel. Sebelum request sampai ke controller atau logika apapun, dia harus melewati router dulu. Memahami cara kerja routing akan membuat kamu lebih mudah membangun struktur aplikasi yang rapi dan mudah di-maintain. Konsep Dasar: Bagaimana Request Diproses Saat browser mengirim request ke GET /posts, Laravel membaca file routes/web.php, mencari […]
Baca Artikel10 November 2025
Contoh Penggunaan Contract di Laravel 12: Implementasi dan Binding
Kalau Anda sudah membaca artikel tentang apa itu Contract di Laravel 12, artikel ini melanjutkannya dengan contoh penggunaan nyata: bagaimana membuat implementasi Contract sendiri dan kapan ini berguna dalam proyek. Menggunakan Contract Bawaan Laravel Contract bawaan Laravel ada di namespace Illuminate\Contracts\*. Contoh yang paling sering dipakai adalah type-hinting di constructor untuk decoupling: <?php namespace App\Services; […]
Baca Artikel9 November 2025
Notification di Laravel 12: Email, Database, dan Channel Kustom
Hampir semua aplikasi web butuh notifikasi: konfirmasi order, reset password, atau pemberitahuan saat ada komentar baru. Laravel punya sistem notifikasi yang cukup fleksibel: satu kelas bisa kirim ke email, database, Slack, dan channel lain sekaligus. Artikel ini membahas cara kerja notification di Laravel 12, mulai dari membuat kelas notifikasi, kirim via email dan database, sampai […]
Baca ArtikelIngin Membaca Artikel Lainnya?
Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.
Lihat Semua Artikel