Horizon
Antrean tanpa pemantauan adalah tempat pekerjaan menghilang diam-diam. Horizon memberi kamu angka, riwayat, dan alarm — plus kemampuan menambah worker sendiri saat antrean menumpuk.
Intisari
- Khusus untuk antrean Redis. Tidak bekerja dengan driver database atau SQS.
- Konfigurasi worker pindah dari argumen CLI ke
config/horizon.phpyang ter-review. autoScalingStrategymenambah dan mengurangi worker berdasarkan beban.- Dasbornya wajib dilindungi gate — ia menampilkan payload job, yang sering berisi data pribadi.
horizon:terminatedi setiap deploy, atau worker akan menjalankan kode lama.
Memasang
composer require laravel/horizon
php artisan horizon:install
php artisan horizon
// config/horizon.php
'environments' => [
'production' => [
'supervisor-utama' => [
'connection' => 'redis',
'queue' => ['penting', 'default'],
'balance' => 'auto',
'autoScalingStrategy' => 'time', // berdasarkan estimasi waktu tunggu
'minProcesses' => 1,
'maxProcesses' => 20,
'tries' => 3,
'timeout' => 90,
'memory' => 256,
'nice' => 0,
],
'supervisor-berat' => [
'connection' => 'redis',
'queue' => ['media'], // transkode gambar/video
'maxProcesses' => 4,
'timeout' => 900,
'memory' => 1024,
],
],
],
Memisahkan supervisor per jenis pekerjaan itu penting. Tanpa pemisahan, satu job pemrosesan gambar berdurasi sepuluh menit akan menahan worker yang seharusnya mengirim notifikasi dalam 200 ms. Pisahkan berdasarkan durasi dan kebutuhan memori, bukan berdasarkan bagian aplikasi.
Strategi penyeimbangan
Nilai balance | Perilaku |
|---|---|
false | Antrean dihabiskan sesuai urutan prioritas |
simple | Worker dibagi rata antar antrean |
auto | Worker dipindahkan ke antrean yang sedang menumpuk |
Dengan auto dan autoScalingStrategy: 'time', Horizon mengukur estimasi waktu tunggu
tiap antrean dan mengalokasikan proses ke yang paling terdesak. Ini yang kamu mau di hampir semua kasus.
Mengamankan dasbor
// app/Providers/HorizonServiceProvider.php
protected function gate(): void
{
Gate::define('viewHorizon', fn ($user) => $user->peran === Peran::Admin);
}
Ini bukan opsional. Dasbor Horizon menampilkan payload setiap job — di dalamnya sering ada alamat email, ID pengguna, isi notifikasi, dan kadang token. Secara default ia hanya terbuka di lingkungan lokal, tapi banyak orang membukanya di produksi lalu lupa memasang gate. Perlakukan URL-nya sebagai halaman yang sama sensitifnya dengan panel admin.
Metrik yang perlu diperhatikan
| Metrik | Artinya kalau memburuk |
|---|---|
| Waktu tunggu | Worker kurang, atau ada job yang menahan |
| Throughput (job/menit) | Turun tiba-tiba = ada yang macet |
| Job gagal | Naik = layanan luar bermasalah, atau bug baru |
| Runtime rata-rata per job | Naik = query yang melambat, atau payload membesar |
| Proses aktif | Mentok di maxProcesses terus-menerus = perlu dinaikkan |
// AppServiceProvider — alarm saat antrean tertinggal jauh
Horizon::routeSlackNotificationsTo(config('services.slack.webhook'));
Horizon::$waitTimeLongerThan = [
'redis:penting' => 30, // detik
'redis:default' => 300,
];
Deploy
php artisan horizon:terminate # selesaikan job berjalan, lalu keluar dengan rapi
terminate menunggu job yang sedang diproses selesai sebelum mematikan proses — berbeda dengan
mematikannya paksa, yang akan meninggalkan job setengah jalan. Di ECS, ini dijembatani oleh
stop timeout yang harus lebih panjang daripada job terpanjangmu, dan dibahas di Fase 9.
php artisan horizon:pause # berhenti mengambil job baru
php artisan horizon:continue
php artisan horizon:status
php artisan horizon:clear # kosongkan antrean — hati-hati
Horizon atau SQS?
| Redis + Horizon | SQS | |
|---|---|---|
| Dasbor bawaan | Ya | Tidak — pakai CloudWatch |
| Penskalaan worker | Otomatis di dalam Horizon | Lewat autoscaling ECS |
| Beban operasional | Ada klaster yang harus diurus | Terkelola penuh |
| Ketahanan pesan | Bergantung persistensi Redis | Sangat tinggi |
| Batas ukuran payload | Praktis besar | 256 KB |
| Job tertunda & batch | Penuh | Tunda maksimum 15 menit |
Pola yang sering dipakai: keduanya. Redis + Horizon untuk pekerjaan aplikasi sehari-hari yang butuh visibilitas dan penundaan panjang; SQS untuk pekerjaan yang harus benar-benar tidak boleh hilang atau yang menyeberang ke sistem lain. Laravel mendukung banyak koneksi antrean sekaligus, jadi ini tidak perlu jadi pilihan biner.
Latihan: pasang Horizon dengan dua supervisor — satu untuk default, satu untuk
media dengan timeout panjang. Antrekan 500 job sekaligus dan amati grafik waktu tunggu serta
penambahan proses otomatisnya.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.