Laravel Horizon: Monitoring Laravel Queue dengan Redis
Setelah menggunakan Laravel Queue untuk menjalankan background job, kita mungkin mulai membutuhkan cara untuk melihat apa yang sebenarnya terjadi pada queue.
Berapa banyak job yang sedang diproses? Apakah ada job yang gagal? Berapa lama sebuah job membutuhkan waktu untuk selesai?
Laravel menyediakan Laravel Horizon untuk membantu memantau queue yang menggunakan Redis.
Horizon menyediakan dashboard yang menampilkan informasi mengenai job, queue, proses worker, failed jobs, dan statistik queue.
Apa Itu Laravel Horizon?
Laravel Horizon adalah dashboard dan konfigurasi queue worker untuk Laravel yang dirancang khusus untuk Redis.
Jika sebelumnya kita memiliki:
Laravel
↓
Redis
↓
Queue Worker
↓
Job
Horizon menambahkan monitoring di atas sistem tersebut:
Laravel
↓
Redis
↓
Queue Workers
↓
Jobs
↑
│
Horizon
Dengan Horizon, kita dapat melihat kondisi queue melalui dashboard.
Kenapa Menggunakan Horizon?
Tanpa Horizon, kita mungkin hanya melihat worker melalui:
php artisan queue:work
atau memeriksa log aplikasi.
Ketika jumlah queue mulai bertambah, cara tersebut menjadi kurang praktis.
Horizon menyediakan informasi seperti:
- Job yang sedang diproses
- Job yang berhasil
- Job yang gagal
- Waktu pemrosesan job
- Jumlah job yang menunggu
- Queue worker yang sedang berjalan
- Statistik queue
Ini sangat membantu ketika aplikasi sudah memiliki banyak background job.
Install Laravel Horizon
Horizon dapat diinstall menggunakan Composer:
composer require laravel/horizon
Setelah package terinstall, publish asset dan konfigurasi Horizon:
php artisan horizon:install
Laravel akan membuat konfigurasi Horizon di:
config/horizon.php
File tersebut menjadi tempat untuk mengatur konfigurasi worker Horizon.
Konfigurasi Redis
Karena Horizon bekerja dengan Redis, pastikan aplikasi Laravel sudah menggunakan Redis dengan benar.
Contohnya:
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=null
Jika Laravel Queue menggunakan Redis, konfigurasi queue dapat menggunakan:
QUEUE_CONNECTION=redis
Kemudian bersihkan konfigurasi cache Laravel:
php artisan config:clear
Pastikan Redis berjalan:
redis-cli ping
Hasil yang diharapkan:
PONG
Menjalankan Horizon
Untuk menjalankan Horizon, gunakan:
php artisan horizon
Jika berhasil, Horizon akan menjalankan queue worker dan mulai memproses job yang ada di Redis.
Berbeda dengan:
php artisan queue:work
Horizon menyediakan proses worker yang dikelola melalui konfigurasi Horizon.
Dashboard Horizon
Salah satu fitur utama Horizon adalah dashboard monitoring.
Secara default, dashboard dapat diakses melalui:
/horizon
Misalnya:
https://example.com/horizon
Dashboard tersebut memberikan gambaran mengenai kondisi queue aplikasi.
Biasanya kita dapat melihat beberapa informasi seperti:
Jobs
├── Recent Jobs
├── Failed Jobs
└── Completed Jobs
Queues
├── Pending
├── Processing
└── Completed
Dashboard ini sangat berguna ketika kita ingin mengetahui apakah queue berjalan normal atau ada masalah.
Konfigurasi Worker Horizon
Konfigurasi worker berada di:
config/horizon.php
Contoh konfigurasi sederhana:
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => [
'default',
],
'balance' => 'auto',
'processes' => 3,
'tries' => 3,
],
],
],
Konfigurasi tersebut menentukan bagaimana Horizon menjalankan worker pada environment production.
Misalnya:
'processes' => 3,
berarti Horizon dapat menjalankan beberapa worker untuk memproses queue.
Jumlah worker sebaiknya disesuaikan dengan kapasitas server dan beban aplikasi.
Memisahkan Queue
Aplikasi yang lebih besar biasanya memiliki beberapa jenis pekerjaan.
Misalnya:
default
emails
notifications
reports
Horizon memungkinkan kita mengatur worker berdasarkan queue tersebut.
Contohnya:
'queue' => [
'emails',
'notifications',
'default',
],
Dengan begitu kita dapat mengatur prioritas dan kapasitas worker sesuai kebutuhan aplikasi.
Misalnya proses pengiriman email membutuhkan worker tersendiri, sedangkan proses laporan menggunakan queue berbeda.
Monitoring Failed Jobs
Salah satu manfaat Horizon adalah mempermudah menemukan job yang gagal.
Misalnya sebuah job mengalami exception ketika melakukan request ke API eksternal.
Daripada hanya mencari error melalui log, kita dapat melihat failed job melalui dashboard Horizon.
Kita juga tetap dapat menggunakan Artisan:
php artisan queue:failed
Untuk mencoba kembali job:
php artisan queue:retry all
Horizon membantu memberikan gambaran visual mengenai kondisi tersebut.
Horizon dan Supervisor
Jika sebelumnya kita menggunakan Supervisor untuk menjalankan:
php artisan queue:work
Horizon juga merupakan proses yang harus tetap berjalan pada server production.
Karena itu, Horizon dapat dijalankan menggunakan Supervisor.
Contoh konfigurasi:
[program:horizon]
process_name=%(program_name)s
command=php /var/www/example.com/artisan horizon
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/www/example.com/storage/logs/horizon.log
stopwaitsecs=3600
Sesuaikan path aplikasi dengan lokasi project Laravel Anda.
Setelah konfigurasi dibuat:
sudo supervisorctl reread
Kemudian:
sudo supervisorctl update
Dan cek status:
sudo supervisorctl status
Jika berhasil, kurang lebih akan terlihat:
horizon RUNNING
Dengan setup tersebut, Supervisor menjaga proses Horizon tetap berjalan.
Restart Horizon Setelah Deployment
Ketika melakukan deployment dan ada perubahan kode pada Job, Horizon perlu diberi tahu untuk menggunakan kode terbaru.
Laravel menyediakan:
php artisan horizon:terminate
Command tersebut akan menghentikan proses Horizon dengan cara yang aman.
Setelah proses berhenti, Supervisor dapat menjalankannya kembali.
Alurnya:
Deploy
↓
horizon:terminate
↓
Horizon berhenti
↓
Supervisor
↓
Horizon dijalankan kembali
↓
Kode terbaru digunakan
Ini penting dalam deployment production agar worker tidak terus menggunakan kode lama.
Horizon vs Queue Worker Biasa
Secara sederhana, keduanya sama-sama digunakan untuk memproses Laravel Queue, tetapi Horizon memberikan kemampuan monitoring dan konfigurasi worker yang lebih lengkap.
| Fitur | Queue Worker | Horizon |
|---|---|---|
| Redis Queue | Ya | Ya |
| Memproses Job | Ya | Ya |
| Dashboard | Tidak | Ya |
| Monitoring Queue | Terbatas | Ya |
| Statistik | Terbatas | Ya |
| Konfigurasi Worker | CLI | horizon.php |
| Monitoring Failed Jobs | Terbatas | Ya |
Jika aplikasi masih sederhana, queue:work mungkin sudah cukup.
Namun ketika aplikasi mulai memiliki banyak background job dan menggunakan Redis secara intensif, Horizon menjadi sangat berguna.
Kesimpulan
Laravel Horizon memberikan dashboard dan pengelolaan worker yang lebih baik untuk aplikasi Laravel yang menggunakan Redis.
Arsitektur sederhananya:
Laravel
↓
Redis
↓
Laravel Horizon
↓
Queue Worker
↓
Job
Dengan Horizon, kita dapat lebih mudah memantau job, failed jobs, queue, worker, dan performa background process.
Untuk production, Horizon juga dapat dikombinasikan dengan Supervisor agar proses Horizon tetap berjalan dan otomatis dijalankan kembali ketika berhenti.
Jika aplikasi Laravel Anda sudah menggunakan Redis untuk Queue, Horizon merupakan langkah berikutnya yang cukup natural untuk meningkatkan monitoring dan pengelolaan background job.
