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.