Concurrency

Di Laravel 11, fitur Concurrency membantu mempercepat proses yang melibatkan beberapa tugas berat dengan menjalankannya secara paralel atau bersamaan. Dengan Concurrency, Anda dapat menjalankan beberapa operasi, seperti menjalankan beberapa query database atau tugas-tugas latar belakang, secara bersamaan dan secara berurutan. Ini sangat membantu dalam waktu eksekusi bisa dipersingkat secara signifikan dengan pemrosesan paralel, seperti mengambil data dari beberapa sumber sekaligus atau mengelola batch besar tugas asinkron.

Untuk menggunakan fitur ini, Anda bisa membuat serangkaian closure atau fungsi yang dijalankan dalam waktu bersamaan. Laravel akan menjalankan fungsi-fungsi ini dalam worker CLI proses yang terpisah, mengembalikan hasilnya dalam urutan yang Anda tentukan setelah semua proses selesai. Laravel 11 menyediakan tiga opsi driver untuk Concurrency:

  1. Process (default) - menjalankan closure di proses CLI terpisah.
  2. Fork - meningkatkan kinerja dengan menjalankan di proses yang dipisah dengan forking.
  3. Sync - menjalankan tugas secara berurutan (berguna untuk testing).

Fitur ini sangat bermanfaat untuk beban kerja yang panjang, namun penggunaannya harus disesuaikan dengan kebutuhan aplikasi Anda dan lingkungan pengembangannya, seperti testing dan produksi

Set Driver

anda bisa menggunakan driver tertentu sesuai yang anda butuhkan

Concurrency::driver('process')->run(); // driver default
Concurrency::driver('fork')->run();
Concurrency::driver('sync')->run();

atau anda bisa publish concurrency pada config

php artisan config:publish concurrency

akan ada file baru di config/concurrency.php

return [
 
/*
|--------------------------------------------------------------------------
| Default Concurrency Driver
|--------------------------------------------------------------------------
|
| This option determines the default concurrency driver that will be used
| by Laravel's concurrency functions. By default, concurrent work will
| be sent to isolated PHP processes which will return their results.
|
| Supported: "process", "fork", "sync"
|
*/
 
'default' => env('CONCURRENCY_DRIVER', 'process'),
 
];

setup di file .env sehingga anda mudah mengganti driver melalui .env

 
...
 
CONCURRENCY_DRIVER=process
 
...

Pengujian Menggunakan Concurrency

membuat data factory User sebanyak 10 ribu

php artisan tinker
 
User::factory()->count(10000)->create();

buat view

php artisan make:view home

buat kode seperti berikut di controller atau di route:

 
Route::get('/', function () {
[$users, $deleteUsers] = Concurrency::run([
fn() => User::get(),
fn() => User::onlyTrashed()->get(),
]);
 
return view('home', [
'users' => $users,
'deleteUsers' => $deleteUsers
]);
});

pada view home

<div>
<div>{{ $users->count() }}</div>
<div>{{ $deleteUsers->count() }}</div>
</div>

install Laravel Debugbar pada link berikut disini

composer require barryvdh/laravel-debugbar --dev

maka hasil dari debugbar terlihat seperti berikut:

terlihat Queries: 3 yang digunakan dengan Memory Usage: 149 MB dan Request Duration: 1.41s

Pengujian Tanpa Conccurency

 
Route::get('/', function () {
$users = User::get();
$deleteUsers = User::onlyTrashed()->get();
 
return view('home', [
'users' => $users,
'deleteUsers' => $deleteUsers
]);
});

terlihat Queries: 5 yang digunakan dengan Memory Usage: 22 MB dan Request Duration: 246ms

Kesimpulan

  1. Concurrency (Eksekusi Paralel)

Dalam kasus concurrency di atas, Concurrency memproses sejumlah data secara paralel. Ini dapat membantu menurunkan jumlah query yang dilakukan (karena beberapa operasi dapat digabungkan), tetapi biasanya akan membutuhkan lebih banyak memori, seperti yang terlihat dalam hasil Anda:

  • Queries: 3
  • Memory Usage: 149 MB
  • Request Duration: 1.41s

Namun, meskipun waktu eksekusi lebih lama, concurrency bisa menghemat jumlah query yang dieksekusi, sehingga mengurangi beban kerja database dengan menyatukan proses. Tetapi, peningkatan penggunaan memori terjadi karena beberapa data dimuat sekaligus.

  1. Non-Concurrency (Tanpa Eksekusi Paralel)

Dalam mode non-concurrency, data diproses satu per satu atau dalam batch kecil. Ini mengurangi penggunaan memori karena data dimuat dan diproses lebih sedikit sekaligus, tetapi jumlah query meningkat:

  • Queries: 5
  • Memory Usage: 22 MB
  • Request Duration: 246ms

Dalam hal ini, beban kerja untuk database lebih besar karena ada lebih banyak query yang harus dieksekusi. Namun, konsumsi memori jauh lebih rendah karena tidak ada data yang dimuat secara paralel.

Komentar

Ada 0 komentar pada episode ini.