什么是 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 中把该名称用于其他连接。CSP nonce(Content Security Policy)
若希望作为 Content Security Policy 的一环,为 Horizon 视图内使用的script / style 标签设置 nonce 属性,可使用 Horizon::cspNonce 方法。由于每个请求都会分配新的 nonce,通常在中间件中调用。
config/horizon.php 的 middleware 选项中。
Supervisor(监督者)
每个环境可以拥有一个或多个”Supervisor”。Supervisor 是 Worker 组的管理单位,可以在同一环境下运行多个拥有不同队列、平衡策略和进程数的 Supervisor。默认值
通过defaults 选项可以为所有 Supervisor 设定默认值。
维护模式
当应用处于维护模式时,Horizon 默认不会处理任务。若要强制处理,可使用force 选项。
任务最大重试次数
tries 设为 0 表示允许无限次重试。
任务超时
backoff(重试等待时间)
指定发生异常后到再次重试的等待秒数。其他 Worker 选项
除了tries、timeout、backoff,每个 Supervisor 还支持控制 Worker 进程行为和自动重启时机的选项。定期重启长时间运行的进程是防止内存泄漏的良好实践。
memory— Worker 进程在重启前可消耗的最大内存(MB)。默认为128maxJobs— 重启前处理的任务数。0表示无限制。默认为0maxTime— Worker 在重启前可运行的秒数。0表示不按时间重启。默认为0sleep— 无任务时距下一次轮询的等待秒数。默认为3rest— 每个任务处理之间暂停的秒数。默认为0nice— Worker 进程的优先级(“niceness”)。值越大优先级越低。默认为0
平衡策略
Horizon 提供了 3 种 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 的指标仪表板会显示任务与队列的吞吐量和执行时间。为定期获取快照,需要设置调度。config/horizon.php 的 metrics.trim_snapshots 选项,可以设置指标图表保留的快照数量。该配置不是限制快照的经过时间而是件数,因此实际保留时间取决于 horizon:snapshot 命令的执行频率。
任务失败的通知
当队列等待时间过长时,可以接收通知。可在app/Providers/HorizonServiceProvider.php 的 boot() 方法中配置。
等待时间阈值
通过config/horizon.php 的 waits 选项设置触发通知的等待秒数。
0 会禁用该队列的通知。
失败任务的管理
失败的任务可以通过 ID 或 UUID 删除。升级
Horizon 大版本升级时,请务必查看升级指南。相关页面
队列与任务
Laravel 队列的基础。介绍任务的创建、派发、批处理与失败处理。
Redis
作为 Horizon 后端所需的 Redis 的配置与用法。