Laravel Horizon: Queue Monitoring and Management at Scale
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.
Related Articles
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