Blog by Fadil Rumasoreng

Saya menulis tentang pengalaman saya membangun aplikasi, eksperimen teknologi, dan ide-ide seputar web development. Semua ini saya bagikan atau saya tulis murni dari pengalaman yang saya dapatkan ketika mengembangkan perangkat lunak.

Cara Menggunakan Queue di Laravel dengan Database Driver

CNFadil Rumasoreng· 30 Sep 2025· 0
Cara Menggunakan Queue di Laravel dengan Database Driver

Pelajari cara menggunakan Laravel Queue dengan database: tutorial praktis, contoh kode, dan best practice untuk pemula hingga menengah.


Pendahuluan

Ketika kamu membuat aplikasi berbasis Laravel, ada kalanya kamu butuh menunda eksekusi proses tertentu agar tidak membebani request utama. Misalnya:

  • Mengirim email selamat datang saat user registrasi

  • Memproses upload gambar berukuran besar

  • Sinkronisasi data ke API eksternal

  • Mengirim notifikasi push ke ribuan user

Kalau semua dijalankan langsung di dalam request, aplikasi akan terasa lambat. Inilah alasan Laravel menyediakan Queue.

Di artikel ini, kita akan fokus membahas Laravel Queue dengan driver database — solusi sederhana tanpa perlu Redis atau Beanstalkd. Cocok untuk developer pemula–menengah dan project kecil–menengah.


Apa Itu Database Queue?

Secara sederhana:

  • Queue = antrian pekerjaan (job) yang bisa dieksekusi di background.

  • Database Queue = job disimpan di tabel database (jobs). Worker Laravel membaca tabel ini lalu mengeksekusi job satu per satu.

Keuntungan Database Queue

  • Tidak butuh Redis/Beanstalkd — cukup pakai MySQL/PostgreSQL/SQLite.

  • Mudah di-setup — hanya perlu migrasi tabel.

  • Cocok untuk pemula — tidak ada instalasi tambahan.

Kekurangan

  • Kurang optimal untuk skala besar (lebih lambat dibanding Redis).

  • Bergantung pada kinerja database.


Langkah-Langkah Implementasi Queue dengan Database

Mari kita coba langsung implementasi.


1. Atur Driver Queue di .env

Laravel mendukung banyak driver (sync, database, redis, dll). Ubah environment jadi database:

QUEUE_CONNECTION=database

2. Buat Tabel Queue

Laravel menyimpan antrian di tabel jobs. Jalankan:

php artisan queue:table
php artisan migrate

Hasilnya:

  • jobs → menyimpan daftar job menunggu diproses

  • failed_jobs → mencatat job yang gagal


3. Buat Job Baru

Gunakan Artisan:

php artisan make:job SendWelcomeEmail

Contoh implementasi job:

<?php

namespace App\Jobs;

use App\Mail\WelcomeMail;
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;

class SendWelcomeEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $user;

    // Terima data user
    public function __construct($user)
    {
        $this->user = $user;
    }

    // Eksekusi job di background
    public function handle(): void
    {
        Mail::to($this->user->email)->send(
            new WelcomeMail($this->user)
        );
    }
}

4. Dispatch Job dari Controller

Misalnya ketika user register:

use App\Jobs\SendWelcomeEmail;

public function register(Request $request)
{
    $user = User::create($request->all());

    // Kirim email di background
    SendWelcomeEmail::dispatch($user);

    return response()->json(['message' => 'User created']);
}

👉 Dengan cara ini, respon API tetap cepat, karena email dikirim lewat queue.


5. Jalankan Queue Worker

Queue tidak akan berjalan kalau worker belum aktif. Jalankan:

php artisan queue:work

Worker akan terus membaca tabel jobs dan mengeksekusi job satu per satu.

Catatan: Jika worker dihentikan, job akan tetap ada di database sampai worker dijalankan lagi.


Testing Queue

  1. Jalankan php artisan queue:work

  2. Lakukan proses register

  3. Cek email (gunakan Mailtrap, Mailhog, atau log driver)

  4. Lihat tabel jobs → job akan hilang setelah sukses dieksekusi


Menangani Job Gagal

Kadang job bisa gagal (misalnya SMTP down). Laravel sudah siapkan mekanisme retry.

Buat Tabel Failed Jobs

Jika belum:

php artisan queue:failed-table
php artisan migrate

Melihat Job Gagal

php artisan queue:failed

Retry Job yang Gagal

php artisan queue:retry {id}

Hapus Job yang Gagal

php artisan queue:forget {id}

(Opsional) Menjalankan Worker dengan Supervisor di Linux

Di server production (Ubuntu/Debian), gunakan Supervisor agar worker tetap jalan.

1. Install Supervisor

sudo apt install supervisor

2. Buat Config Worker

File: /etc/supervisor/conf.d/laravel-worker.conf

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/project/artisan queue:work database --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/path/to/project/storage/logs/worker.log

3. Restart Supervisor

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

Alur Singkat Queue

1. User register
2. Controller dispatch(SendWelcomeEmail)
3. Job disimpan di tabel `jobs`
4. Worker queue:work membaca job
5. Email terkirim

Kesimpulan

Menggunakan Laravel Queue dengan Database adalah solusi praktis untuk developer pemula–menengah yang ingin:

  • Membuat aplikasi lebih cepat & responsif

  • Menunda proses berat (misalnya email, notifikasi, report)

  • Tidak perlu install Redis/Beanstalkd

Meskipun tidak secepat Redis, database queue sudah cukup untuk project kecil–menengah dan sangat mudah diimplementasikan.


FAQ

1. Apakah database queue cukup untuk aplikasi besar?
Tidak. Untuk traffic tinggi, gunakan Redis atau SQS.

2. Apa bedanya queue:work dan queue:listen?
queue:work lebih cepat & efisien. queue:listen restart worker setiap ada job, lebih lambat.

3. Bagaimana cara retry otomatis job gagal?
Gunakan opsi --tries=3 di worker atau tambahkan retry di Supervisor config.

4. Apakah job dihapus setelah sukses?
Ya, job akan hilang dari tabel jobs setelah berhasil dieksekusi.

5. Bisa pakai Horizon dengan database driver?
Tidak, Horizon hanya mendukung Redis.

Komentar

Belum ada komentar.