4 Min Read

Menggunakan Laravel Horizon Package untuk Memonitoring Queue

iman-sugirman Iman Sugirman

Laravel Memiliki Package first party untuk memonitoring job queue atau background job yang bisa dijadwalkan atau delaying. Package itu disebut Horizon gratis dan sangat bagus dalam visualisasi. Jika anda sebelumnya adalah Rails Developer anda pastinya sudah faham dengan hal ini karena di Ruby on Rails itu ada yang namanya Sidekiq. Horizon hanyalah package yang hanya bisa memonitoring Queue dari laravel, sedangkan yang melakukan job action proccessing nya biasanya menggunakan Redis.

Selain Redis anda juga bisa menggunakan AWS sqs dari amazon, namun jika aplikasi anda masih terhitung kecil dan tidak terlalu komplex, Redis masih sangat berfungsi dengan baik.

Baiklah sekarang kita akan mengimplementasikan menggunakan Horizon dan Redis di Server Aplikasi Laravel anda.

Install Redis di Server Ubuntu

Untuk menginstall redis anda harus mengerti beberapa cara untuk menggunakan sudo untuk pengguna ubuntu.

Update terlebih dahulu semua package dari server anda.

sudo apt update

Lalu instal Redis dengan mengetik:

sudo apt install redis-server

Ini akan mengunduh dan menginstal Redis serta dependensinya. Setelah ini, ada satu perubahan konfigurasi penting yang harus dibuat di dalam berkas konfigurasi Redis, yang dihasilkan secara otomatis selama instalasi.

Edit konfigurasi Redis dengan nano dengan cara mengetik :

sudo nano /etc/redis/redis.conf

Edit bagian supervised menggunakan systemd yang ada di file /etc/redis/redis.conf

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised systemd

Restart Redis anda dengan memasukan perintah :

sudo systemctl restart redis.service

Setup Aplikasi Laravel anda

Baik sekarang kita kembali ke Aplikasi Laravel anda dan menginstall package horizon dari laravel

composer require laravel/horizon

Setelah menginstall package sekarang kita install horizon nya

php artisan horizon:install

Dan akan menghasilkan file config/horizon.php sekarang kita konfigurasikan horizon.php dan sesuaikan dengan kebutuhan anda. Untuk membedakan antara development dan production.

'environments' => [
    'production' => [
        'supervisor-1' => [
            'maxProcesses' => 10,
            'balanceMaxShift' => 1,
            'balanceCooldown' => 3,
        ],
    ],

    'local' => [
        'supervisor-1' => [
            'maxProcesses' => 3,
        ],
    ],
],

Di pengaturan Default kita akan menggunakan redis sebagai defaultnya :

'defaults' => [
    'supervisor-1' => [
        'connection' => 'redis',
        'queue' => ['default'],
        'balance' => 'auto',
        'maxProcesses' => 1,
        'memory' => 128,
        'tries' => 1,
        'nice' => 0,
    ],
],

Anda juga harus mengkonfigurasikan untuk permission akses hanya user tertentu dan itu bisa anda setup difile app/Providers/HorizonServiceProvider.php menjadi seperti ini :

/**
 * Register the Horizon gate.
 *
 * This gate determines who can access Horizon in non-local environments.
 *
 * @return void
 */
protected function gate()
{
    Gate::define('viewHorizon', function ($user) {
        return in_array($user->email, [
            'anda@aplikasi.com',
        ]);
    });
}

Publish semua package dari horizon dengan memasukan perintah :

php artisan horizon:publish

Dan script di file composer.json agar otomatis publish horizon ketika melakukan composer reload :

{
    "scripts": {
        "post-update-cmd": [
            "@php artisan horizon:publish --ansi"
        ]
    }
}

Jika anda masih tahap development anda bisa menjalankan perintah :

# Untuk Menjalankan Horizon
php artisan horizon
# Untuk Melakukan Pause
php artisan horizon:pause
# Untuk Melakukan Melanjutkan
php artisan horizon:continue

Sedangkan untuk di Production nanti menggunakan supervisord

Install Supervisord di Server

Install Supervisor di Server

sudo apt-get install supervisor

Lalu anda harus membuat file di folder /etc/supervisor/conf.d dengan nama contohnya horizon.conf sample nya seperti ini :

[program:horizon]
process_name=%(program_name)s
# Sesuaikan dengan Direktori Aplikasi anda
command=php /home/forge/example.com/artisan horizon
autostart=true
autorestart=true
# Sesuaikan dengan User Aplikasi anda
user=forge
redirect_stderr=true
# Sesuaikan dengan Direktori Aplikasi anda
stdout_logfile=/home/forge/example.com/horizon.log
stopwaitsecs=3600

Masukan beberapa perintah untuk menjalankan supervisord

# Perintah untuk Membaca Kembali
sudo supervisorctl reread
# Perintah untuk Mengupdate
sudo supervisorctl update
# Perintah untuk Memulai Horizon dengan menggunakan `supervisor`
sudo supervisorctl start horizon

Sekarang saatnya kita coba untuk menggunakannya Go Run gaesss...

php artisan make:job UploadDataProcessJob

Dan akan membuat file di App/Jobs/UploadDataProcessJob lalu sekarang kita edit :

<?php

namespace App\Jobs;

use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Notification;


class CandidateProccessJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
    // Parameter yang diterima dari Controller
    protected $user;

    
    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function handle()
    {
        $user = $this->user;

        // Contoh jika Job Processingnya mengirimkan Email ke User
        Notification::send($user, new SendEmailToUser($user));

    }

Untuk Lebih lengkap Membuat Notification anda bisa membaca artikel tentang Membuat Notification Email dan Database di Laravel

Dan cek di url https://aplikasianda.com/horizon maka akan muncul queue dan jika anda membuat banyak job pun akan tampil disana sehingga proses background job akan sangat tertata.

Demikian artikel tentang Menggunakan Laravel Horizon Package untuk Memonitoring Queue