Laravel 用 Horizon 接管 Redis 队列:监控、失败重试与伸缩

test12026-10-228 次阅读

安装与配置

Horizon 是官方队列仪表盘,基于 Redis,把队列的吞吐、失败、延迟全部可视化。先装包并发布配置,再把默认队列驱动指向 redis。

composer require laravel/horizon
php artisan horizon:install
# .env
QUEUE_CONNECTION=redis
// config/horizon.php 关键片段
'environments' => [
    'production' => [
        'supervisor-1' => [
            'maxProcesses' => 10,
            'balance' => 'auto',
            'queues' => ['default', 'mail'],
        ],
    ],
    'local' => [
        'supervisor-1' => [
            'maxProcesses' => 3,
            'queues' => ['default'],
        ],
    ],
],

定义带重试与超时的 Job

Job 上声明最大尝试次数、重试间隔与超时,失败会自动进 retries 队列,超过上限再落到 failed 表,可被 horizon:clear 或重试命令处理。

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class SyncOrder implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $tries = 3;
    public $timeout = 60;
    public $backoff = [5, 15, 30];

    public function handle(): void
    {
        // 调第三方同步订单,失败抛异常即触发重试
    }
}

仪表盘与伸缩

本地跑 php artisan horizon 即可打开 /horizon 看板,观察每个队列的 jobs per minute 与失败情况。生产环境用 supervisor 拉起 horizon 进程,进程数随流量在配置里上调即可,无需改业务代码。

php artisan horizon        # 本地常驻
php artisan horizon:status  # 查看状态
php artisan horizon:terminate

关键结论

  • Horizon 把队列从黑盒变成可观测:吞吐、延迟、失败一目了然。
  • 重试与退避写在 Job 上,失败可追回,不会静默丢失。
  • 横向伸缩只调 supervisor 的 maxProcesses,业务无感。
T

test1

文章作者

安装与配置 Horizon 是官方队列仪表盘,基于 Redis,把队列的吞吐、失败、延迟全部可视化。先装包并发布配置,再...

分类
技术
发布时间
2026-10-22
字数
约 1490 字
阅读
8 次