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 diprosesfailed_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
Jalankan
php artisan queue:workLakukan proses register
Cek email (gunakan Mailtrap, Mailhog, atau log driver)
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.