Laravel Queues Jobs Events Listeners Notifications
Definisi
Di Laravel, lima konsep ini sering dipakai bersama untuk memisahkan proses sinkron dan asinkron:
- Queue adalah antrean kerja yang menunda eksekusi tugas sampai worker memprosesnya.
- Job adalah unit pekerjaan yang dikirim ke queue.
- Event adalah sinyal bahwa sesuatu sudah terjadi di aplikasi.
- Listener adalah respons terhadap event tertentu.
- Notification adalah mekanisme untuk mengirim pesan ke user lewat channel seperti mail, database, broadcast, Slack, atau SMS provider.
Kalau disederhanakan:
- event = “sesuatu terjadi”
- listener = “apa yang harus dilakukan setelah itu”
- job = “pekerjaan yang bisa dipindah ke queue”
- queue = “tempat menaruh pekerjaan sampai diproses”
- notification = “pesan yang dikirim ke penerima”
Kenapa topik ini penting
Di aplikasi Laravel yang tumbuh, tidak semua pekerjaan cocok dikerjakan langsung di request web. Kalau semua dipaksa sinkron, dampaknya biasanya cepat terasa:
- response jadi lambat karena request menunggu proses berat selesai
- user tetap menunggu walau proses bisa dikerjakan belakangan
- kode controller membesar karena semua langkah ditumpuk di satu tempat
- integrasi eksternal jadi rapuh karena timeout atau retry tidak tertata
- side effect seperti email, logging, dan sinkronisasi data bercampur dengan logic utama
Pemisahan queue, job, event, listener, dan notification membantu aplikasi tetap responsif, lebih mudah dirawat, dan lebih aman saat beban naik.
Kapan pekerjaan dipindah ke queue
Tidak semua tugas perlu di-queue. Queue berguna saat pekerjaan tidak harus selesai sekarang juga dan boleh selesai beberapa detik atau menit kemudian.
Kandidat yang baik untuk queue
- kirim email atau notifikasi yang tidak perlu blocking request
- generate file, PDF, thumbnail, atau export data
- sinkronisasi ke service eksternal
- proses batch besar
- reindex search
- audit log atau analytic event yang boleh delay
- webhook retry
- cleanup atau maintenance task yang tidak kritis untuk response user
Kandidat yang sebaiknya tetap sinkron
- validasi input
- keputusan bisnis yang harus memengaruhi response saat itu juga
- query ringan yang dibutuhkan untuk menampilkan halaman sekarang
- operasi kecil yang justru lebih rumit kalau dipindah ke queue
Aturan praktis
Pindahkan ke queue kalau:
- hasilnya tidak dibutuhkan untuk membentuk response saat itu juga
- prosesnya cukup berat atau berpotensi lambat
- ada kemungkinan gagal dan perlu retry
- tugasnya aman dijalankan ulang
- efek sampingnya lebih baik dipisahkan dari request utama
Jangan dipindah ke queue hanya karena “terlihat modern”. Queue menambah kompleksitas operasional: worker, retry, failed jobs, monitoring, dan idempotency.
Alur besar job di queue
Urutan ini penting:
- ada pemicu, misalnya controller, event listener, atau scheduler
- job dibuat dan dikirim ke queue
- worker menjalankan job di proses terpisah dari request web
- kalau gagal, job bisa di-retry atau masuk failed jobs
Dengan cara ini, request user tidak harus menunggu seluruh pekerjaan selesai.
Queue
Definisi
Queue adalah mekanisme antrean untuk menunda eksekusi task. Laravel mendukung beberapa driver queue, misalnya database, Redis, SQS, atau sync untuk mode tanpa antrean nyata.
Fungsi utama
- memisahkan proses berat dari request utama
- memberi retry dan backoff
- menjaga worker tetap konsisten memproses task
- memudahkan pemantauan pekerjaan async
Konsep penting
- queue connection: backend antrean yang dipakai
- queue worker: proses yang mengambil dan mengeksekusi job
- retry: percobaan ulang saat job gagal
- failed job: job yang gagal setelah batas retry tertentu
- delay: penundaan sebelum job dieksekusi
Contoh pengiriman job ke queue
ProcessPodcast::dispatch($podcast);Kalau ingin menunda eksekusi:
ProcessPodcast::dispatch($podcast)->delay(now()->addMinutes(5));Catatan implementasi
Queue baru benar-benar bekerja kalau ada worker yang berjalan. Kalau tidak ada worker, job akan menumpuk dan tidak pernah diproses.
Jobs
Definisi
Job adalah kelas yang mewakili satu unit kerja. Job biasanya dipakai untuk tugas yang bisa dijalankan asinkron, misalnya mengirim email, memproses file, atau memanggil API eksternal.
Struktur umum
Job biasanya punya:
- data yang dibawa ke job
- method
handle()untuk menjalankan pekerjaan - kadang
tries,backoff,timeout, atauqueuetertentu
Contoh sederhana:
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendWelcomeEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(public int $userId)
{
}
public function handle(): void
{
// ambil user, kirim email, atau jalankan proses lain
}
}Kapan job dipakai
Pakai job saat kamu ingin:
- memindahkan kerja ke queue dengan eksplisit
- memisahkan logic async dari controller atau listener
- mengelola retry dan timeout per task
- menamai pekerjaan dengan jelas untuk monitoring
Catatan penting
Kalau job membawa model Eloquent, Laravel akan mencoba meng-serialize model tersebut dengan cara yang aman untuk queue. Tapi tetap hati-hati:
- jangan bawa object besar yang tidak perlu
- jangan asumsikan state model masih sama saat job diproses nanti
- ambil ulang data penting di dalam
handle()bila perlu
Events
Definisi
Event adalah sinyal domain atau aplikasi bahwa sesuatu sudah terjadi. Event bukan tempat melakukan semua pekerjaan; event hanya menandai fakta.
Contoh event:
UserRegisteredOrderPaidInvoiceGeneratedProfileUpdated
Fungsi event
- memisahkan pemicu dari efek samping
- membuat kode lebih mudah diperluas
- memungkinkan banyak listener untuk satu kejadian
- menjaga controller tetap tipis
Kapan event dipakai
Event cocok saat satu kejadian bisa memicu banyak aksi berbeda. Contohnya:
- user daftar → kirim welcome email, buat profil default, catat audit log
- order dibayar → update status, kirim notifikasi, sinkronisasi ke sistem lain
- artikel dipublikasikan → reindex search, invalidate cache, kirim broadcast
Event bukan logic bisnis utama
Event sebaiknya dipakai untuk memberi tahu bahwa sesuatu sudah terjadi. Logic inti tetap di service, action class, atau layer domain yang memang bertanggung jawab atas proses tersebut.
Listeners
Definisi
Listener adalah kelas yang merespons event tertentu. Satu event bisa punya banyak listener, dan tiap listener bisa menjalankan tugas yang berbeda.
Alur event → listener
Listener sinkron vs queued
Listener bisa dijalankan langsung atau dipindah ke queue.
- sinkron cocok untuk aksi cepat dan sederhana
- queued listener cocok untuk tugas berat seperti email, broadcasting, atau integrasi eksternal
Kalau listener mengimplementasikan ShouldQueue, Laravel akan memperlakukannya sebagai pekerjaan async.
Contoh listener
use Illuminate\Contracts\Queue\ShouldQueue;
class SendWelcomeEmail implements ShouldQueue
{
public function handle(UserRegistered $event): void
{
// kirim email
}
}Kenapa listener sering lebih tepat daripada menaruh logic langsung di event
Event sebaiknya ringan. Listener memberi lapisan yang lebih jelas untuk side effect. Dengan begitu:
- event tetap jadi penanda fakta
- efek samping bisa ditambah tanpa mengubah pemicu
- kode lebih mudah diuji dan dirawat
Notifications
Definisi
Notification adalah mekanisme Laravel untuk mengirim pesan ke penerima melalui berbagai channel.
Channel yang umum:
- database
- broadcast
- Slack
- SMS atau provider lain lewat channel custom
Kapan notification dipakai
Notification cocok saat kamu perlu memberi tahu user atau sistem lain tentang suatu peristiwa, misalnya:
- reset password
- verifikasi email
- order berhasil dibayar
- status pengiriman berubah
- alert operasional
Notification dan queue
Notification juga bisa di-queue. Ini penting kalau channel pengiriman lambat atau jumlah penerimanya banyak.
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
class OrderPaidNotification extends Notification implements ShouldQueue
{
public function via($notifiable): array
{
return ['mail', 'database'];
}
}Kalau notification di-queue, pengiriman pesan tidak menahan response utama.
Catatan praktis
Notification sering jadi pilihan lebih rapi daripada job biasa kalau tujuan utamanya memang mengabari user. Job lebih umum; notification lebih semantik.
Hubungan antar konsep
Keempat mekanisme ini sering saling bertemu, tapi fungsinya tetap beda.
- event menandai kejadian
- listener merespons kejadian
- job mengeksekusi kerja async
- queue menyimpan kerja sampai diproses
- notification mengirim pesan ke penerima
Pola yang umum:
- controller atau service menjalankan aksi inti
- aplikasi dispatch event
- listener merespons event
- listener men-delegate pekerjaan berat ke job atau langsung menjadi queued listener
- notification dikirim ke user jika perlu
Contoh alur lengkap
Misalnya user berhasil mendaftar:
- controller menyimpan user baru
- aplikasi dispatch event
UserRegistered - listener pertama membuat profil default
- listener kedua mengirim welcome notification
- listener ketiga mencatat audit log
- jika email berat, pengiriman notifikasi berjalan lewat queue
Contoh alur tersebut membuat controller tetap tipis dan side effect mudah ditambah tanpa mengubah alur utama.
Jebakan umum pada async processing
1. Mengirim object yang terlalu besar ke job
Job sebaiknya membawa data minimum yang dibutuhkan. Kalau payload terlalu besar, serialization jadi berat dan job makin rentan gagal.
2. Mengandalkan state yang bisa berubah sebelum job diproses
Karena job dieksekusi belakangan, data di database bisa sudah berubah. Jangan mengasumsikan state saat dispatch masih sama saat worker menjalankan job.
3. Lupa idempotency
Job dan listener queued bisa dieksekusi ulang saat retry. Kalau tugasnya tidak idempotent, efek samping bisa dobel:
- email terkirim dua kali
- transaksi eksternal terproses dua kali
- record tercatat dua kali
Solusinya biasanya dengan:
- pengecekan deduplication
- status marker
- unique constraint
- idempotency key
4. Menaruh logic bisnis inti di listener async
Kalau sesuatu harus selesai sebelum response dibentuk, jangan taruh di queued listener. Logic inti tetap perlu sinkron.
5. Tidak memikirkan timeout dan retry
Task yang lambat tanpa timeout yang jelas bisa menumpuk. Task yang gagal tanpa backoff bisa terus mengulang dan membebani sistem.
6. Worker tidak dijalankan atau tidak dipantau
Queue tanpa worker itu hanya penyimpanan job. Pastikan worker berjalan, restart saat deploy bila perlu, dan failed jobs dipantau.
7. Exception handling yang terlalu diam
Kalau job gagal, jangan cuma berharap retry menyelesaikan semuanya. Perlu observabilitas: log, failed job, alert, atau dashboard monitoring.
8. Notification dipakai untuk logika yang seharusnya job
Kalau tujuannya bukan memberi tahu penerima, notification bukan pilihan utama. Gunakan job untuk pekerjaan umum, notification untuk pesan ke notifiable.
Catatan implementasi produksi
Queue driver
Pilih driver sesuai kebutuhan produksi:
syncuntuk dev atau kasus sederhana tanpa worker nyatadatabaseuntuk setup yang cepat dan mudah dipahamiRedisuntuk throughput yang lebih baikSQSatau managed queue lain untuk skala dan reliabilitas yang lebih tinggi
Retry dan backoff
Untuk job yang rentan gagal karena service eksternal, atur retry dan backoff agar sistem tidak spam request ke target yang sedang bermasalah.
Failed jobs
Pastikan ada proses untuk:
- melihat failed jobs
- memperbaiki penyebabnya
- me-run ulang jika aman
Batas tanggung jawab
Pemisahan yang sehat biasanya seperti ini:
- controller: menerima request dan mengorkestrasi alur
- service/domain action: logic inti
- event: sinyal kejadian
- listener: efek samping berbasis event
- job: kerja async terpisah
- notification: pesan ke penerima
Ringkasan keputusan cepat
Kalau kamu bingung harus pakai apa, pakai urutan ini:
- perlu memberi tahu bahwa sesuatu terjadi? → event
- perlu merespons kejadian itu? → listener
- pekerjaannya berat atau lambat? → job + queue
- pekerjaannya mengirim pesan ke user? → notification
- perlu memproses task belakangan? → queue
Referensi terkait
- Laravel Queues
- Laravel Events
- Laravel Notifications
- Laravel Queued Jobs
- Laravel Queue Listeners
- Konsep async processing dan idempotency di aplikasi produksi