SYS://VISION.ACTIVE
VIEWPORT.01
LAT 28.0222° N
SIGNAL.NOMINAL
VISION Loading
Back to Blog

Laravel Horizon: Queue Monitoring and Management at Scale

Shane Barron

Shane Barron

Laravel Developer & AI Integration Specialist

Beyond Basic Queues

Laravel Horizon provides a beautiful dashboard and configuration system for your Redis queues. It gives you insight into job throughput, runtime, and failures—the visibility you need to operate queues confidently in production.

Installation and Configuration

composer require laravel/horizon
php artisan horizon:install

Configuring Supervisors

// config/horizon.php
'environments' => [
    'production' => [
        'supervisor-1' => [
            'connection' => 'redis',
            'queue' => ['high', 'default', 'low'],
            'balance' => 'auto',
            'minProcesses' => 3,
            'maxProcesses' => 10,
            'balanceMaxShift' => 1,
            'balanceCooldown' => 3,
        ],
        'supervisor-emails' => [
            'connection' => 'redis',
            'queue' => ['emails'],
            'balance' => 'simple',
            'processes' => 3,
            'tries' => 3,
        ],
    ],
],

Queue Prioritization

Horizon processes queues in the order listed. High-priority jobs get processed first:

// Dispatching to priority queues
ProcessPayment::dispatch($order)->onQueue('high');
SendWelcomeEmail::dispatch($user)->onQueue('default');
GenerateReport::dispatch($data)->onQueue('low');

Auto-Balancing

The 'auto' balance strategy adjusts worker allocation based on queue workload:

'balance' => 'auto',
'minProcesses' => 1,
'maxProcesses' => 10,

Monitoring and Metrics

Horizon's dashboard shows:

  • Jobs processed per minute
  • Failed jobs with stack traces
  • Job wait times (time in queue)
  • Job runtime metrics
  • Worker status

Handling Failures

// Notification on failures
Horizon::routeMailNotificationsTo('ops@example.com');
Horizon::routeSlackNotificationsTo(
    'https://hooks.slack.com/...',
    '#alerts'
);

// Custom failure handling
class ProcessPayment implements ShouldQueue
{
    public function failed(Throwable $exception): void
    {
        // Alert on-call team
        PagerDuty::alert('Payment processing failed', [
            'order_id' => $this->order->id,
            'error' => $exception->getMessage(),
        ]);
    }
}

Production Deployment

Run Horizon with Supervisor:

[program:horizon]
process_name=%(program_name)s
command=php /var/www/app/artisan horizon
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/www/app/storage/logs/horizon.log
stopwaitsecs=3600

Security

Restrict dashboard access in production:

// In HorizonServiceProvider
Gate::define('viewHorizon', function ($user) {
    return in_array($user->email, [
        'admin@example.com',
    ]);
});

Conclusion

Horizon transforms queue management from a black box into a transparent, manageable system. Use it for any production application running Redis queues.

Share this article
Shane Barron

Shane Barron

Strategic Technology Architect with 40 years of experience building production systems. Specializing in Laravel, AI integration, and enterprise architecture.

Need Help With Your Project?

I respond to all inquiries within 24 hours. Let's discuss how I can help build your production-ready system.

Get In Touch