L
Laravel โฑ๏ธ Interactive 15-Minute Recipe โ€ข Literally Web ID

Tuning Concurrency Queue Worker Laravel Horizon di Server Produksi Berkapasitas Terbatas

โฑ๏ธ 15 menit baca โ€ข ๐Ÿ“… 21 Oct 2026 โ€ข ๐Ÿ‘๏ธ 2 views
Tuning Concurrency Queue Worker Laravel Horizon di Server Produksi Berkapasitas Terbatas
๐Ÿ”Š Dengarkan Artikel Ini

Dalam 15 menit ke depan, kita akan merakit racikan infrastruktur yang menyelamatkan malam-malam dari pagerduty yang berdering nyaring. Pagi itu, notifikasi Discord berteriak lantang: server VPS produksi berkapasitas 2 vCPU dan RAM 4GB kami mendadak swap memory-nya jebol. Penyebabnya klasik namun mematikan: lonjakan trafik membuat Laravel Horizon memuntahkan ratusan background job secara bersamaan, menghantam database MySQL hingga koneksinya jenuh, lalu PHP-FPM dan worker queue saling berebut resource sampai kernel Linux melakukan Out-Of-Memory (OOM) Killer. Sebagai arsitek sistem, kita tidak bisa sekadar menambah RAMโ€”itu jalan pintas mahal yang malas. Kita butuh presisi. Mari kita bedah bagaimana cara menjinakkan Horizon di atas besi terbatas agar tetap ganas memproses data tanpa membuat server megap-megap.

1. Menu Kita Hari Ini & Alat yang Perlu Disiapkan

Bayangkan kita sedang berada di dapur restoran cepat saji yang dapurnya kecil, tapi pesanan drive-thru membludak. Kita tidak bisa menjejalkan semua koki ke satu stasiun kerja; mereka akan saling senggol dan piring pecah. Di dunia nyata infrastruktur web modern, kita berurusan dengan kombinasi Laravel, Redis sebagai in-memory data store dan broker antrean, Supervisor sebagai pengawas proses, serta Nginx dan MySQL di balik layar. Kita asumsikan Anda sudah memiliki VPS Ubuntu 22.04 LTS terinstal PHP 8.2, Composer, Redis, dan database relational. Tugas kita hari ini bukanlah menginstal ulang semuanya dari awal, melainkan membedah konfigurasi config/horizon.php dan system daemon agar selaras dengan kapasitas RAM yang pas-pasan. Siapkan terminal Anda, pastikan akses sudo berada di tangan, dan mari kita mulai meracik.

Namun, sebelum kita menyentuh baris kode konfigurasi, kita harus paham ke mana arah navigasi arsitektur ini dalam peta jalan sistem kita.

2. Peta Jalan Singkat: Apa yang Sedang Kita Rakit

Untuk menjinakkan monster antrean di server kecil, kita tidak bisa menebak-nebak angka konkurensi. Kita akan bergerak melalui tiga fase krusial: Pertama, kita merombak strategi process balancing Horizon agar adaptif terhadap beban tanpa melibas habis alokasi CPU. Kedua, kita menyuntikkan mekanisme siklus hidup worker untuk mencegah memory leak laten khas aplikasi PHP jangka panjang. Ketiga, kita mengisolasi antrean prioritas tinggi dan menyiapkan Dead Letter Queue agar job yang gagal berulang kali tidak memblokir antrean utama. Dari peta jalan ini, mari kita langsung terjun ke fondasi dasarnya.

3. Langkah 1: Mempersiapkan Fondasi & Environment

Hal pertama yang sering dilewatkan engineer junior adalah mengabaikan batasan sistem operasi dan langsung menaikkan angka worker di Horizon. Hasilnya? Too many connections error di MySQL. Buka file konfigurasi environment .env pada aplikasi Laravel Anda, lalu kita batasi koneksi dan tentukan koneksi Redis yang bersih.

QUEUE_CONNECTION=redis
# Batasi koneksi Redis agar tidak meluber
REDIS_CLIENT=phpredis
REDIS_MAX_CLIENTS=100

[!WARNING] Jangan pernah menggunakan driver sync atau database untuk beban kerja produksi berkapasitas terbatas. Driver database akan mencatat setiap job ke tabel MySQL secara sinkron, menciptakan I/O bottleneck yang langsung melumpuhkan CPU server Anda.

Setelah .env disesuaikan, kita perlu memastikan bahwa ekstensi PHP Redis berjalan optimal menggunakan phpredis alih-alih predis karena performa memori-nya jauh lebih efisien untuk operasi antrean skala masif. Dari fondasi environment ini, kita bergeser ke jantung permasalahan: meracik konfigurasi inti Horizon.

4. Langkah 2: Meracik Konfigurasi Inti Tanpa Basa-basi

Buka file config/horizon.php Anda. Di sinilah seni pertunjukan dimulai. Kita akan membuang opsi auto-balancing default yang sering terlalu agresif memakan proses CPU, lalu menggantinya dengan strategi simple balancing yang terukur atau auto dengan batas minimum-maksimum yang ketat.

Perhatikan blok konfigurasi environments di bawah ini. Kita alokasikan server produksi kita (misal: production-server-1) untuk membagi beban secara adil antara job prioritas berat dan ringan.

'environments' => [
    'production' => [
        'supervisor-1' => [
            'connection' => 'redis',
            'queue' => ['critical', 'default'],
            'balance' => 'simple',
            'balanceMaxProcesses' => 3,
            'balanceCooldown' => 3,
            'processes' => 2,
            'tries' => 3,
            'timeout' => 60,
            'memory' => 128,
        ],
        'supervisor-2' => [
            'connection' => 'redis',
            'queue' => ['emails', 'notifications'],
            'balance' => 'simple',
            'balanceMaxProcesses' => 2,
            'balanceCooldown' => 3,
            'processes' => 1,
            'tries' => 3,
            'timeout' => 30,
            'memory' => 96,
        ],
    ],
],

[!TIP] Opsi 'balance' => 'simple' membagi jumlah proses secara merata ke setiap antrean yang terdaftar. Ini jauh lebih aman untuk server ber-RAM di bawah 4GB ketimbang 'auto' yang kerap menduplikasi proses worker secara liar saat lonjakan trafik mikro terjadi.

Perhatikan parameter memory => 128 dan memory => 96. Angka ini bukan sekadar pajangan; ini adalah batas pengaman yang akan menginstruksikan Horizon untuk mematikan dan meregenerasi worker secara anggun begitu konsumsi RAM-nya melampaui batas tersebut. Transisi dari memori yang bocor ini membawa kita langsung ke mekanisme pertahanan berikutnya.

5. Langkah 3: Sentuhan Akhir Keamanan & Optimasi

Aplikasi PHP secara natif rentan terhadap akumulasi memori akibat garbage collection yang tidak sepenuhnya bersih pada siklus hidup yang panjang (long-running processes). Di sinilah parameter maxJobs dan perintah queue:restart berperan sebagai lapis pengaman tambahan melalui Supervisor.

Buat atau sesuaikan file konfigurasi Supervisor Anda di /etc/supervisor/conf.d/laravel-worker.conf:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan horizon
autostart=true
autorestart=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/html/storage/logs/horizon.log
stopwaitsecs=3600

[!IMPORTANT] Jalankan perintah sudo supervisorctl reread dan sudo supervisorctl update setiap kali Anda mengubah file konfigurasi di atas agar daemon Supervisor merefresh proses worker yang berjalan di background.

Selain itu, pastikan Anda mendaftarkan event listener di app/Providers/AppServiceProvider.php untuk mendengarkan kejadian JobFailed agar job yang gagal secara fatal langsung dilempar ke Dead Letter Queue terisolasi, alih-alih mencoba mengeksekusi ulang tanpa henti yang menghabiskan kuota Redis.

6. Tes Rasa: Memastikan Semuanya Berjalan Sempurna

Saatnya mencicipi racikan kita. Jalankan perintah verifikasi berikut di terminal server Anda untuk melihat apakah Horizon bernapas dengan lega:

php artisan horizon:status

Jika racikan berhasil, Anda akan melihat respons konsol yang elegan:

Horizon status: running

Selanjutnya, pantau penggunaan memori secara langsung melalui utilitas sistem Linux untuk memastikan tidak ada lonjakan ekstrem:

htop

Tekan tombol F4 di htop, ketik php atau redis-server, dan lihat bagaimana konsumsi RAM stabil di kisaran angka yang telah kita batasi tadi. Jika angka tersebut landai dan tidak merayap naik secara kontinu, konfigurasi kita sukses total.

7. Pertolongan Pertama: Jika Terjadi Kendala Kecil

Terkadang di lapangan, ada saja kerikil kecil. Jika Anda mendapati dashboard Horizon menampilkan status Inactive meskipun service Supervisor menyala, jangan panik. Periksa izin kepemilikan direktori storage/ dan bootstrap/cache/ dengan perintah:

sudo chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache
sudo chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache

Seringkali masalah sepele seperti hak akses direktori log membuat PHP gagal menulis status antrean ke Redis. Segarkan kembali cache konfigurasi Laravel dengan php artisan config:clear, dan Horizon Anda akan kembali melesat kencang tanpa hambatan.

๐Ÿท๏ธ Tags: #Redis #Php #Devops #Laravel #Queue

Apakah panduan tutorial ini membantu Anda?

Masukan Anda sangat berharga untuk terus memperbarui dan menyempurnakan kualitas materi teknis kami.

๐ŸŽ‰

Terima kasih banyak atas apresiasi Anda!

Tim kami terus menyempurnakan tutorial agar selalu akurat dengan versi teknologi terbaru.

Bantu Kami Menyempurnakan Materi Ini

โšก Literally Tech Digest

Update Tutorial & Developer Tools Terbaru Langsung ke Email Anda

Dapatkan kurasi artikel arsitektur software, tips DevOps, panduan database, serta rilis fitur developer utility gratis setiap minggu. Bebas spam, bisa berhenti kapan saja.

โณ Mencari artikel...
Tutorial & Artikel Terkait
Developer Tools
Tidak ditemukan tutorial atau tool dengan kata kunci "".
Ketik minimal 2 karakter untuk mencari artikel atau nama tools.
Tekan ESC untuk menutup Cari di Semua Artikel →