Horizon 队列管理工具

更新时间: 2019-07-31 20:15

介绍

Horizon 提供了一个漂亮的仪表盘,并且可以通过代码配置你的 Laravel Redis 队列,同时它允许你轻易的监控你的队列系统中诸如任务吞吐量,运行时间和失败任务等关键指标。

所有的配置项都存放在一个简单的配置文件中,从而允许你将它放在团队的协同版本控制中,方便团队协作。

安装

{note} 由于 Horizon 中使用了异步处理信号,所以安装扩展包需要 PHP 在 7.1 以上。其次,你应该确保 queue 配置文件中设置了 redis 队列驱动。

你应该使用 Composer 来安为你的 Laravel 项目安装 Horizon:

composer require laravel/horizon

安装完成后,使用 vendor:publish 发布 Artisan 命令:

php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"

配置

发布 Horizon 相关文件后,他的主要配置文件会放在 config/horizon.php。你可以在这个文件中配置队列相关选项,并且每个配置项都有详细的使用说明,请详细阅读此文件。

均衡配置

Horizon 提供了三种均衡策略:simpleauto, 和 false。默认的是 simple ,会将收到的任务均分给队列进程:

'balance' => 'simple',

auto 策略会根据当前的工作量调整每个队列的工作进程任务数量。例如:如果 notifications 队列有 1000 个待执行任务,但是你的 render 队列是空的,Horizon 会分配更多的工作进程给 notifications 队列,直到 notifications 队列中所有任务执行完成。当配置项 balance 配置为 false 时,Horizon 会使用 Laravel 默认执行行为,它将按照配置中列出的顺序处理队列任务。

仪表盘权限验证

Horizon 仪表盘路由是 /horizon。 默认情况下,你只能在 local 环境下访问仪表盘。我们可以使用 Horizon::auth 方法给仪表盘定义更具体的访问策略。auth 方法接收一个回调函数作为参数,该回调函数应当返回 truefalse,以确认用户是否具有仪表盘的访问权限。通常情况下,你应当在 AppServiceProviderboot 方法中调用 Horizon::auth

Horizon::auth(function ($request) {
    // return true / false;
});

运行 Horizon

当在 config/horizon.php 文件中配置好了你的队列执行进程后,你就可以使用 horizon Artisan 命令启动 Horizon。只需要一条命令语句即可启动所有配置好的队列进程:

php artisan horizon

你也可以使用 horizon:pausehorizon:continue Artisan 命令来暂停或继续执行队列任务:

php artisan horizon:pause

php artisan horizon:continue

你可以使用 horizon:terminate Artisan 命令优雅的终止 Horizon 主进程。Horizon 会把正在执行的任务处理完毕后退出:

php artisan horizon:terminate

部署 Horizon

如果你将 Horizon 部署到线上服务器时,则需要配置一个进程监控器来检测 php artisan horizon 命令,在它意外退出时自动重启。上线新代码时则需要该进程监控器终止 Horizon 进程并以修改后的代码重启 Horizon。

Supervisor 配置

如果你使用 Supervisor 进程监控器管理你的 horizon 进程,那么以下配置文件则可满足需求:

[program:horizon]
process_name=%(program_name)s
command=php /home/forge/app.com/artisan horizon
autostart=true
autorestart=true
user=forge
redirect_stderr=true
stdout_logfile=/home/forge/app.com/horizon.log

{tip} 如果你不喜欢自己维护服务器,可以考虑使用 Laravel Forge,Forge 提供了运行一个带有 Horizon 的现代、强大的 Laravel 应用所需要的 PHP7+ 及其他所有环境。

标签

Horizon 允许你对任务分配「标签」,包括邮件,事件广播,通知和队列的事件监听器。事实上,Horizon 会智能并且自动根据任务携带 Eloquent 模型给大多数任务标记标签,如下任务示例:

<?php

namespace App\Jobs;

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

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

    /**
     * 工作实例
     *
     * @var  \App\Video
     */
    public $video;

    /**
     * 创建一个工作实例
     *
     * @param    \App\Video  $video
     * @return  void
     */
    public function __construct(Video $video)
    {
        $this->video = $video;
    }

    /**
     * 执行这个工作.
     *
     * @return  void
     */
    public function handle()
    {
        //
    }
}

如果该队列任务是一个携带 id1App\Video 实例,那么它将自动被标记上 App\Video:1 标签。因为 Horizon 会检查任务属性是否具有 Eloquent 模型,如果发现 Eloquent 模型,Horizon 将会智能的用该模型的类名和主键为任务标记上标签:

$video = App\Video::find(1);

App\Jobs\RenderVideo::dispatch($video);

自定义标签

如果你想手动的为队列执行的对象定义标签,你可以给这个类定义一个 tags 方法:

class RenderVideo implements ShouldQueue
{
    /**
     * 获取分配给这个工作的标签
     *
     * @return  array
     */
    public function tags()
    {
        return ['render', 'video:'.$this->video->id];
    }
}

通知

Note: 在使用通知之前,你应该添加 guzzlehttp/guzzle Composer 包到你的项目。在使用 Horizon 配置发送短信通知时,你还应该阅读 Nexmo 通知驱动的依赖条件 章节。

如果需要在队列等待时间过长时发起通知,可以在应用的 AppServiceProvider 中调用 Horizon::routeMailNotificationsTo, Horizon::routeSlackNotificationsTo, 和 Horizon::routeSmsNotificationsTo 方法:

Horizon::routeMailNotificationsTo('example@ example.com');
Horizon::routeSlackNotificationsTo('slack-webhook-url', '#channel');
Horizon::routeSmsNotificationsTo('15556667777');

配置等待时间过长的阈值

你可以在 config/horizon.php 配置文件中设置等待时间过长的具体秒数。waits 配置项可以针对每一个 链接/队列 配置阈值:

'waits' => [
    'redis:default' => 60,
],

Metrics

Horizon 包含一个 Metrics 仪表盘,它可以提供任务和队列等待时间和吞吐量信息,为了填充此仪表盘,你需要配置应用的 scheduler 每五分钟运行一次 Horizon 的 snapshot Artisan 命令:

/**
 * 定义应用程序的命令调度.
 *
 * @param    \Illuminate\Console\Scheduling\Schedule  $schedule
 * @return  void
 */
protected function schedule(Schedule $schedule)
{
    $schedule->command('horizon:snapshot')->everyFiveMinutes();
}
Pro Git (Second Edition)

Pro Git (Second Edition)

Scott Chacon、Ben Straub / Apress / 2014-11-9 / USD 59.99

Scott Chacon is a cofounder and the CIO of GitHub and is also the maintainer of the Git homepage ( git-scm.com ) . Scott has presented at dozens of conferences around the world on Git, GitHub and the ......一起来看看 《Pro Git (Second Edition)》 这本书的介绍吧!

Markdown 在线编辑器

Markdown 在线编辑器

Markdown 在线编辑器

HSV CMYK 转换工具

HSV CMYK 转换工具

HSV CMYK互换工具