← Semua pembelajaran / Laravel Nol → Enterprise
Fase 7 · Performa & Skala

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.

Sumber asli laravel.com Resmi Rangkuman ~5 menit baca

Intisari

  • Khusus untuk antrean Redis. Tidak bekerja dengan driver database atau SQS.
  • Konfigurasi worker pindah dari argumen CLI ke config/horizon.php yang ter-review.
  • autoScalingStrategy menambah dan mengurangi worker berdasarkan beban.
  • Dasbornya wajib dilindungi gate — ia menampilkan payload job, yang sering berisi data pribadi.
  • horizon:terminate di 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 balancePerilaku
falseAntrean dihabiskan sesuai urutan prioritas
simpleWorker dibagi rata antar antrean
autoWorker 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

MetrikArtinya kalau memburuk
Waktu tungguWorker kurang, atau ada job yang menahan
Throughput (job/menit)Turun tiba-tiba = ada yang macet
Job gagalNaik = layanan luar bermasalah, atau bug baru
Runtime rata-rata per jobNaik = query yang melambat, atau payload membesar
Proses aktifMentok 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 + HorizonSQS
Dasbor bawaanYaTidak — pakai CloudWatch
Penskalaan workerOtomatis di dalam HorizonLewat autoscaling ECS
Beban operasionalAda klaster yang harus diurusTerkelola penuh
Ketahanan pesanBergantung persistensi RedisSangat tinggi
Batas ukuran payloadPraktis besar256 KB
Job tertunda & batchPenuhTunda 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.