配置 Horizon 的 queue, balance, processes 参数以及 Redis 中的优先级

Laravel
我假设你正在使用 redis 和  Laravel Horizon, 要开始配置 horizon ,仅需用我下面的命令清空所有进程队列任务中 horizon 的仪表盘。 我也曾在本系列的 a 教程中描述过 链接:

php artisan flush:redis

好了现在一切都清空了,我们可以开始准备学习下面 A 到  I的所有概念

我假设你现在已经根据下面的链接安装了 Horizon  官方文档. 要理解怎么更专业的去配置 laravel 队列,你需要更加熟悉以下简单概念:

设想 A:

config/queue.php文件中,你可以找到redis连接驱动程序的配置。

'queue' => env('REDIS_QUEUE', 'default'),

Laravel

这意味着,如果你没有为队列指定队列的状态,那么它会读取队列的默认配置,即以队列的默认配置进行运行。

然后让我们运行以下命令:

php artisan horizon

当你运行队列的时候 (我假设您知道如何使用onQueue()方法运行队列。如果您不知道,请点击这个链接进行了解 this link). 您将在horizon仪表板中看到:

Laravel

注意: 显然,retry_after 值必须大于队列运行所需要的时间。泰勒设置了90秒。
Laravel

概念 B:

你可以 设置 (或者说 修改) 默认的 队列状态  将 redis 连接替换成 任何  你想要的名称

首先在config/queue.php 将 redis 连接由 ‘default’ 改为 ‘foo’.

'queue' => env('REDIS_QUEUE', '***foo***'),

然后清空配置缓存:

php artisan config:cache

在触发任务之后(我假设你没有为任务指定「队列状态类型」,并将 onQueue() 方法留空),然后执行以下操作:

php artisan horizon

在 horizon 仪表盘中你会看见队列任务将会获得 foo 队列的状态 ,注意 「状态」.
Laravel

正如你所见,这个队列任务 并未处理!  如果要处理它,即系跟着下一个概念学习.

概念 C:

让我们看一下 config/horizon.php 这个配置文件. 你会在文件的最后发现两个数组的key .一个是 Production  另一个是 local. 根据.env 文件中你已经配置好环境变量 选择你想要的.

Laravel

production 和 local中,你可以看见队列的状态被设置为 ‘default’.

这意味着如果你要运行 horizon 你需要执行 artisan 命令 

php artisan horizon

默认情况下,它将只处理具有默认值队列状态(例如优先级)的任务。虽然我们已经将概念 B中redis连接的默认队列状态从'default'更改为'foo',并且每个触发的任务都将获得'foo'作为其队列状态。

我们能做什么? 我们可以增加 ‘foo’ 到队列状态值中,如下所示:

这样,我们引入 config/queue.php 到 config/horizon.php 中的修改内容

Laravel

然后:

php artisan config:cache

再然后:

php artisan horizon

然后再次触发脚本你将会看见:

Laravel

贴士:

直到现在,我们还没有为任务指定「队列状态」和每个任务获取到的 redis 驱动预设的默认值

但是我们可以在触发任务时 为每个队列状态 设置值,而不是默认值. 如果你想这样,可以继续看下一个概念.

概念 D:

优先级队列状态 只是一个名称 ,仅此而已。 当你为一个任务设置‘高’队列状态,它不会比其他名称更高的优先级并且在 Laravel 中不会有任何意义直到你为它定义确切的含义。 在你定义之后 ( 我将在后面显示), Laravel 会将状态‘高’的任务推送至优先级较高的队列。

概念 E:

Laravel 如何理解每个队列状态(队列值)的优先级 ?

简单! 仅通过此数组的顺序

'queue' => ['default','foo'],

我将给你看一个例子。

我们设置“队列状态值”的顺序是:「我们如何确定它们的优先级」。

例:

首先 停止 horizon。 然后按此顺序推送两个任务,首先是 Job1 (queue=foo) 然后是 Job2 (queue=default)。

在概念 G 中, 我将说明如何设置优先级名称。

Laravel

如您所见任务还未处理。 所以使用 artisan 命令运行 horizon :

php artisan horizon

您将在终端看到:

Laravel

这意味着 Job2 的优先级高于 Job1。 ‘default’ 优先于 ‘foo’,只因为它们在数组中定义的顺序。正如您看到的, 首先执行 ‘default’ 然后执行 ‘foo’:

'environments' => [
        'production' => [
            'supervisor-1' => [
                'connection' => 'redis',
                'queue' => ['default','foo'],
                'balance' => 'simple',
                'processes' => 10,
                'tries' => 3,
            ],
        ],
       'local' => [
            'supervisor-1' => [
                'connection' => 'redis',
                'queue' => ['default','foo'],
                'balance' => 'simple',
                'processes' => 3,
                'tries' => 3,
            ],
        ],
    ],

注意:

如果你不使用 horizon,需开启一个工作进程 (在继续执行 ‘foo’ 队列之前先执行正在处理的 ‘default’ 队列任务),请将以逗号分割的队列名称列表传递至 artisan work 命令:

php artisan queue:work --queue=default,foo

请参考 Laravel 文档 here.

概念 F:

您可能想要为不同的队列任务定义不同的优先级(队列状态)。换言之, 您可能需要优先执行队列的处理方式。

根据以下的类型, 您在命名**队列状态***时有两种选择:

类型 I

您可以遵循带有暗示优先级的类型,例如:

‘low’, ‘high’, ‘default’

类型 II:

您可以根据分类为队列任务命名,例如:

‘email’, ‘render’, ‘resize, 等等。

问题是我们应该在哪里使用每一种类型呢? 在下面, 您将找到答案。请跟着概念 H 和 概念 I

概念 G:

分发到特定队列

dispatch((new TheJob)->onQueue('foo'));

或使用 dishpatchNow 方法如:

TheJob::dispatchNow()->onQueue('foo'));

以下两个命令都可使用

PostPaymentJobTest::dispatch();
dispatch(new PostPaymentJobTest());

我也将发布新文章或更新本教程,以设置 Laravel 通知的队列状态。敬请期待!

概念H:

让我们谈谈Laravel Horizon 配置文件中的 ‘balance’ .在config/horizon.php文件中,你可以看到 :

'environments' => [
        'production' => [
            'supervisor-1' => [
                'connection' => 'redis',
                'queue' => ['default'],
                'balance' => 'simple',
                'processes' => 10,
                'tries' => 3,
            ],
        ],
        'local' => [
            'supervisor-1' => [
                'connection' => 'redis',
                'queue' => ['default'],
                'balance' => 'simple',
                'processes' => 3,
                'tries' => 3,
            ],
        ],
    ],

如果你想要遵循概念F中描述的风格I. 你应该关闭balance 并且把它设置为 ‘false’ 而不是 ‘simple’.

'queue' => ['high','default','low'],
'balance' => 'false',

在 ‘balance’ 选项被设置为 ‘false’ 的时候, 默认的Laravel行为将会被触发, 队列将会以它们在队列数组中的顺序被处理.

'queue' => [‘high’,‘default’,‘low’],

首先 high 然后 default 最后 low

概念 I:

正如你在 horizon 配置看到的, 有一个 ‘processes’ 键。

'processes' => 3,

如果 ‘balance’ 的值不等于 ‘false’, ‘processes’ 将有意义。你应该遵循 Style II, 这将在 概念 F. 中介绍。

在新的教程中,我将介绍 “Laravel 如何将资源专用于每一个进程中”。

最后重要的说明:

注意点 A:

  • 每当你改动代码,都需要终止 Horizon 并重启。

注意点 B:

  • 在同一个服务器运行 Horizon 的多个安装时,你需要指定不同的前缀,否则,你可能会凉。

根据 config/horizon.php 设置的值,我们可以在 .env file 设置自定义值:

HORIZON_PREFIX=ApplicationName-horizon:

Laravel

甚至没有在 .env 文件设置的时候,我们可以像这样编辑 config/horizon.php :

'prefix' => env('APP_NAME').env('HORIZON_PREFIX', '-horizon:'),

注意点 C:

  • Horizon 将监听所有服务器上的所有队列。而只处理每个服务上配置文件中的队列。为了更好的体验,建议你为每一个网站设置不同的状态名称列表,方便查看。

就像你在 概念 B: 上看到一样,我们甚至可以设置 foo (一个任意的名称),因此,我们可以使用 .env 文件为每台服务器设置特定的队列名称,然后运行 “php artisan horizon”。

就和你看到的一样,我在 config/horizon.php 配置文件中设置此数组 :

'queue' => ['high','default','low'],

我们可以在 .env 文件中为每一个安装设置自定义的名称:

QUEUE_HIGH=ApplicationName-high\
QUEUE_DEFAULT=ApplicationName-default\
QUEUE_LOW=ApplicationName-low

并在 config/horizon.php 添加以下内容:

'queue' => [
    env('QUEUE_HIGH'),
    env('QUEUE_DEFAULT'),
    env('QUEUE_LOW'),
],

不要忘记在 config/queue.php 文件中为 redis 引入默认的连接。

注意点 D:

  • 这很简单,但请牢记这一点:

当你是生产环境时 .env file 文件设置以下内容:

APP_ENV=production

如果是本地环境 ,.env file 设置:

APP_ENV=local

Laravel

如果你在 production, 设置了什么,请确保在你的 local 也同样设置,否则你会因为程序没按照预期运行的结果抓狂。

另外,这些是可用的 Laravel horizon 命令的列表。
Laravel

一些建议:

  • 使用 Laravel 作业和队列时遇到错误,优先检查队列;
  • dispatch_now() 和 dispatch() 区别在于您可以在 Job 类的 handle 方法中使用 第一个;
  • 将 $request 传递给 Job 时,请注意您不能序列化请求。 只有 Eloquent 模型可以序列化和非序列化。.看这里: https://learnku.com/docs/laravel/5.2/queues#writin... 你应该使用 $request->all() 代替 $request,因为 Request 被视为闭包。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://medium.com/@panjeh/laravel-confi...

译文地址:https://learnku.com/laravel/t/37579

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

horizon最牛的就是实现了代码层面的队列分组,很不错的工具。
作者翻译辛苦,赞一个

1年前 评论
ZsmHub

赞一个

10个月前 评论

大佬,我现在有两台机器,怎么用两台机器配置哇。

file

8个月前 评论

好像不是这样哦 他只是均衡的分配了两个队列 比如你是18个 就是各占9个线程队列

2个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!