Laravel Queue dengan Redis: Panduan Background Job untuk Pemula
Ketika aplikasi Laravel mulai menangani banyak proses, tidak semua pekerjaan harus dilakukan langsung ketika pengguna menunggu response dari server.
Misalnya, mengirim email, memproses file, membuat laporan, atau melakukan request ke API pihak ketiga bisa membutuhkan waktu cukup lama. Jika semua proses tersebut dijalankan secara langsung, response aplikasi bisa menjadi lebih lambat.
Laravel menyediakan Queue untuk menjalankan pekerjaan tersebut di belakang layar. Salah satu driver yang cukup populer untuk Laravel Queue adalah Redis.
Pada artikel ini kita akan membahas cara menggunakan Redis sebagai queue driver Laravel dan membuat background job sederhana.
Apa Itu Laravel Queue?
Laravel Queue memungkinkan aplikasi memindahkan pekerjaan yang membutuhkan waktu cukup lama ke proses terpisah.
Sebagai contoh, tanpa queue:
User
↓
Request Laravel
↓
Proses data
↓
Kirim email
↓
Request selesai
Pengguna harus menunggu seluruh proses selesai.
Dengan Queue:
User
↓
Request Laravel
↓
Masukkan Job ke Queue
↓
Response
Kemudian worker memproses job tersebut:
Redis
↓
Queue Worker
↓
Proses Job
Dengan pendekatan ini, proses utama aplikasi dapat memberikan response lebih cepat.
Kenapa Menggunakan Redis?
Laravel mendukung beberapa queue driver. Redis menarik digunakan karena proses memasukkan dan mengambil data dari queue dapat dilakukan dengan cepat.
Redis juga sering digunakan untuk kebutuhan lain di Laravel, misalnya:
- Cache
- Session
- Queue
- Penyimpanan data sementara
Jika Anda sudah menggunakan Redis untuk cache atau session, Redis yang sama juga dapat digunakan sebagai queue driver.
Pada artikel sebelumnya saya sudah membahas [cara menggunakan Redis untuk Cache dan Session di Laravel]. Anda bisa menghubungkannya dengan artikel tersebut menggunakan internal link.
Persiapan Redis
Pastikan Redis sudah berjalan pada server atau komputer Anda. Untuk memastikan Redis tersedia, jalankan:
redis-cli ping
Jika Redis berjalan dengan baik, hasilnya:
PONG
Jika Anda belum menginstall Redis di Ubuntu, saya sudah membahasnya pada artikel Cara Install Redis di Ubuntu untuk Laravel.
Konfigurasi Queue Laravel
Laravel menggunakan konfigurasi pada file .env untuk menentukan queue connection.
Ubah:
QUEUE_CONNECTION=sync
menjadi:
QUEUE_CONNECTION=redis
Dengan konfigurasi tersebut, Laravel akan menggunakan Redis sebagai penyimpanan queue.
Pastikan konfigurasi Redis juga sudah benar pada .env, misalnya:
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
Setelah mengubah konfigurasi environment, bersihkan cache konfigurasi Laravel:
php artisan config:clear
Membuat Job
Sekarang kita bisa membuat Job menggunakan Artisan.
Misalnya kita ingin membuat job untuk memproses data pengguna:
php artisan make:job ProcessUser
Laravel akan membuat file:
app/Jobs/ProcessUser.php
Contoh sederhananya:
<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
class ProcessUser implements ShouldQueue
{
use Queueable;
public function handle(): void
{
// Proses background job
}
}
Karena class tersebut menggunakan:
implements ShouldQueue
Laravel akan memasukkannya ke queue ketika job tersebut dijalankan.
Menambahkan Job ke Queue
Job dapat dimasukkan ke queue menggunakan method dispatch().
Contohnya:
ProcessUser::dispatch();
Misalnya kode tersebut dijalankan ketika user melakukan registrasi:
public function register()
{
// Proses registrasi user
ProcessUser::dispatch();
return response()->json([
'message' => 'Registrasi berhasil',
]);
}
Laravel tidak perlu menjalankan seluruh pekerjaan ProcessUser sebelum memberikan response.
Job akan menunggu untuk diproses oleh queue worker.
Menjalankan Queue Worker
Membuat job saja belum cukup. Harus ada queue worker yang mengambil job dari Redis dan menjalankannya.
Jalankan:
php artisan queue:work
Jika worker berjalan, Laravel akan terus memantau queue dan memproses job yang tersedia.
Ketika:
ProcessUser::dispatch();
dipanggil, job akan masuk ke Redis.
Kemudian worker akan mengambil job tersebut:
Laravel
↓
dispatch()
↓
Redis Queue
↓
queue:work
↓
ProcessUser
Melihat Job yang Gagal
Dalam aplikasi production, sebuah job bisa saja gagal karena berbagai alasan.
Misalnya API eksternal tidak tersedia atau terjadi error ketika memproses data.
Laravel menyediakan failed jobs untuk menangani kondisi tersebut.
Anda dapat melihat job yang gagal dengan:
php artisan queue:failed
Untuk mencoba menjalankan kembali job yang gagal:
php artisan queue:retry all
Sedangkan untuk menghapus daftar failed jobs:
php artisan queue:flush
Queue untuk Apa?
Queue sangat berguna untuk pekerjaan yang tidak harus selesai sebelum pengguna mendapatkan response.
Contohnya:
- Mengirim email
- Mengirim notifikasi
- Memproses gambar
- Membuat laporan
- Import data
- Export data
- Memproses file
- Memanggil API eksternal
- Menjalankan proses yang membutuhkan waktu cukup lama
Sebagai contoh, daripada melakukan proses export ribuan data secara langsung:
Request
↓
Export 10.000 data
↓
Menunggu...
↓
Response
lebih baik:
Request
↓
Buat ExportJob
↓
Response
Kemudian:
Redis
↓
ExportJob
↓
Queue Worker
↓
File export selesai
Pendekatan seperti ini dapat membuat aplikasi terasa lebih responsif.
Kesimpulan
Laravel Queue membantu memindahkan pekerjaan yang membutuhkan waktu lebih lama ke proses background.
Dengan Redis sebagai queue driver, arsitektur sederhananya menjadi:
Laravel Application
↓
Job
↓
Redis
↓
Queue Worker
↓
Background Process
Jika aplikasi Laravel Anda sudah menggunakan Redis untuk cache atau session, Redis yang sama juga dapat dimanfaatkan untuk Queue.
Untuk aplikasi sederhana, menjalankan:
php artisan queue:work
sudah cukup untuk memahami konsep dasarnya. Pada production, queue worker biasanya perlu dijalankan sebagai service agar tetap berjalan dan dapat otomatis dijalankan kembali ketika terjadi masalah.
