Panduan Lengkap Laravel Queues
Mengoptimalkan Performa Aplikasi dengan Pemrosesan Tugas Latar Belakang
Saat membangun aplikasi web yang kompleks, performa dan kecepatan respons server adalah dua faktor utama yang menentukan kepuasan pengguna. Sering kali aplikasi kita dituntut untuk mengeksekusi tugas-tugas berat yang memakan waktu lama, seperti mengirim email konfirmasi, memproses unggahan gambar skala besar, atau melakukan sinkronisasi data dengan API pihak ketiga. Jika tugas-tugas ini diproses secara sinkronis dalam siklus *request-response* biasa, pengguna akan dipaksa menatar layar pemuatan (*loading*) yang lambat. Untuk mengatasi kendala ini, framework Laravel menyediakan arsitektur antrean yang tangguh, yaitu Laravel Queues.
Laravel Queues memungkinkan Anda untuk menunda pemrosesan tugas-tugas yang memakan waktu (*time-consuming tasks*) ke latar belakang. Alih-alih mengeksekusi tugas secara instan, aplikasi akan memasukkan instruksi tugas tersebut ke dalam sebuah daftar antrean terpusat dan langsung mengembalikan respons sukses kepada pengguna. Logikanya mirip dengan dapur restoran: setelah memesan makanan, Anda tidak perlu berdiri menunggu di depan konter masak. Anda akan menerima nomor antrean, kembali ke meja, dan pelayan (dalam hal ini, *queue worker*) akan mengantarkan hidangan tersebut segera setelah selesai diproses di latar belakang.
1. Konfigurasi Driver Antrean (Queue Drivers)
Laravel mendukung berbagai *backend driver* antrean. Dua metode yang paling sering digunakan dalam lingkungan produksi adalah **Database** dan **Redis**.
Opsi A: Menggunakan Database Queue
Ubah variabel koneksi antrean di dalam berkas konfigurasi `.env` Anda:
QUEUE_CONNECTION=database
Kemudian, generate tabel skema `jobs` bawaan Laravel melalui perintah migrasi berikut:
php artisan queue:table
php artisan migrate
Opsi B: Menggunakan Redis Queue (Direkomendasikan untuk Trafik Tinggi)
Pastikan paket dependensi predis telah terinstal di proyek Anda:
composer require predis/predis
Sesuaikan konfigurasi driver antrean pada `.env` menjadi:
QUEUE_CONNECTION=redis
Membuat Struktur Kelas Job
Gunakan perintah artisan untuk men-generate berkas penanganan tugas latar belakang baru:
php artisan make:job SendWelcomeEmail
Buka berkas app/Jobs/SendWelcomeEmail.php dan implementasikan logika tugas serta penanganan *error* di dalamnya:
namespace App\Jobs;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Log;
class SendWelcomeEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $user;
protected $password;
public function __construct(User $user, string $password)
{
$this->user = $user;
$this->password = $password;
}
public function handle(): void
{
Mail::to($this->user->email)->send(new WelcomeEmail($this->user, $this->password));
Log::info('Welcome email sent to: ' . $this->user->email);
}
public function failed(\Throwable $exception): void
{
Log::error('Failed to send welcome email to ' . $this->user->email . ': ' . $exception->getMessage());
}
}
Memicu Pemicuan Tugas (Dispatching Jobs)
Anda dapat memicu panggilan eksekusi job langsung dari *Controller* menggunakan metode statis dispatch:
// Dalam Controller Anda
use App\Jobs\SendWelcomeEmail;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function store(Request $request)
{
$user = User::create($request->all());
SendWelcomeEmail::dispatch($user, $request->password);
return redirect()->back()->with('success', 'User created!');
}
}
Metode Pengiriman Khusus:
Menambahkan jeda waktu eksekusi (*delayed dispatching*):
SendWelcomeEmail::dispatch($user, $password)->delay(now()->addMinutes(5));
Mengarahkan tugas ke nama saluran antrean tertentu (*isolated channels*):
SendWelcomeEmail::dispatch($user, $password)->onQueue('emails');
2. Mengoperasikan Queue Workers
Setelah tugas-tugas berhasil dimasukkan ke dalam antrean, Anda wajib mengaktifkan proses latar belakang (*daemon process*) untuk membaca dan mengeksekusi tugas tersebut:
# Jalankan queue worker standar
php artisan queue:work
# Menjalankan pemrosesan hanya pada saluran antrean spesifik
php artisan queue:work --queue=emails,notifications
# Menghentikan paksa atau me-restart worker
php artisan queue:restart
php artisan queue:stop
Praktik Terbaik Manajemen Antrean di Server Produksi
Untuk memastikan proses pemantauan antrean berjalan mulus tanpa interupsi pada server Anda:
- Gunakan Process Monitor: Integrasikan utilitas pelacak proses seperti **Supervisor** di Linux Server Anda untuk mendeteksi kegagalan daemon dan melakukan *auto-restart* otomatis jika perintah `queue:work` mati tiba-tiba.
- Gunakan Horizon untuk Redis: Jika Anda menggunakan Redis, pasang paket **Laravel Horizon**. Alat ini menyediakan dasbor web interaktif yang indah untuk memantau waktu proses, *job retry*, latensi trafik, dan tingkat kegagalan antrean secara langsung.
- Isolasi Beban Server: Pada aplikasi berskala enterprise, pertimbangkan untuk menjalankan proses *Queue Worker* pada *instance* server VPS terpisah agar konsumsi CPU pemrosesan latar belakang tidak memperlambat kinerja web server utama.