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.

FiturQueue WorkerHorizon
Redis QueueYaYa
Memproses JobYaYa
DashboardTidakYa
Monitoring QueueTerbatasYa
StatistikTerbatasYa
Konfigurasi WorkerCLIhorizon.php
Monitoring Failed JobsTerbatasYa

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.