什么是 Horizon
Laravel Horizon 是 Laravel 官方提供的专用于 Redis 队列的监控仪表盘。可以实时查看任务吞吐量、执行时间和失败情况,并通过代码管理 worker 配置。安装
通过 Composer 安装。config/horizon.php 与 app/Providers/HorizonServiceProvider.php。
配置
config/horizon.php 结构
config/horizon.php 集中管理 worker 的所有配置。核心选项是 environments。
Horizon 内部会使用一个名为
horizon 的 Redis 连接。请不要在 config/database.php 中把这个名字用于其他连接。Supervisor(监督者)
每个环境可以有一个或多个“Supervisor”。它们是 worker 组的管理单元,可以在同一个环境下运行多个具有不同队列、平衡策略和进程数的 supervisor。默认值
defaults 选项可以设置应用于所有 supervisor 的默认值。
维护模式
当应用处于维护模式时,Horizon 默认不会处理任务。如果要强制处理,可以使用force 选项。
任务最大重试次数
tries 设为 0 时表示允许无限次重试。
任务超时
退避(重试等待时间)
指定发生异常后到下一次重试的等待秒数。平衡策略
Horizon 提供三种 worker 平衡策略。auto(默认)
auto(默认)
根据队列负载自动调整 worker 数量。通过
minProcesses 和 maxProcesses 指定范围。time— 根据清空队列的预计时间进行伸缩size— 根据队列内的任务数进行伸缩
在
auto 策略下,队列的顺序并不代表优先级。如果需要强制优先级,请使用多个 supervisor。simple
simple
固定 worker 数量,均匀分配给指定的队列。上例会为
default 和 notifications 各分配 5 个进程。false(不做平衡)
false(不做平衡)
严格按照列举的顺序作为优先级。行为与 Laravel 默认的队列系统类似,但会根据积压情况伸缩 worker 数量。
default 队列的任务始终优先于 notifications 队列被处理。仪表盘的授权
Horizon 仪表盘可通过/horizon 路由访问。本地环境默认对所有人开放,但生产环境需要通过 Gate 定义来限制访问。
编辑 app/Providers/HorizonServiceProvider.php 中的 gate() 方法。
启动 Horizon
基本命令
本地开发:自动重启
要在检测到文件变更时自动重启 Horizon,可以使用horizon:listen 命令。
通过 Supervisor 常驻运行
生产环境中,通过 Supervisor 让 Horizon 常驻运行。安装 Supervisor
创建配置文件
创建/etc/supervisor/conf.d/horizon.conf。
启动 Supervisor
部署时
每次部署代码后重启 Horizon 以生效。autostart=true / autorestart=true,退出后会自动重启。
任务管理
标签
Horizon 会自动检测任务关联的 Eloquent 模型,并加上标签。tags() 方法即可。
tags() 方法会收到事件实例。
静默任务
若不希望某些任务在仪表盘的“已完成任务”列表中显示,可以在config/horizon.php 里将其静默化。
Silenced 接口。
指标与监控
Horizon 的指标仪表盘展示任务与队列的吞吐量和执行时间。需要定时执行快照命令来采集数据。任务失败通知
当队列的等待时间过长时可以接收到通知。可以在app/Providers/HorizonServiceProvider.php 的 boot() 方法中配置。
等待时间阈值
在config/horizon.php 的 waits 选项中配置触发通知的等待秒数。
0 表示禁用该队列的通知。
失败任务的管理
失败任务可以通过 ID 或 UUID 删除。升级
Horizon 主版本升级前,请务必参考升级指南。相关页面
队列与任务
Laravel 队列的基础。任务的创建、派发、批处理与失败处理。
Redis
Horizon 后端所需的 Redis 配置与用法。