注意:在这种方法中,我们使用了Laravel 6.0和Horizon 3.7.2
征服
没有人比您知道哪种行更高的进入流以及哪个线的处理方式最大,但是如果您没有有关此的信息,则是使用地平线的另一个理由,因为它会生成呈现的妈妈在简单直观的仪表板中。
为了利用地平线的平衡,有必要以最佳方式分组,如果您尚未理解这种平衡的工作原理,我建议您从Zechariah Campbell读到这篇文章,从而解释了非常详细的方式。
我相信自我平衡是排队在一天中的某些时间具有处理高峰的系统的理想模型,因此有更多的流程用于该线路,以便有更多的工作等待Zera或离开工作。在等待其他队列的等待中。
按模式我们的 config/horizon.php文件 环境阵列具有与以下图像相似的格式。
例如,例如队列 书籍 和 images 会花费大量的处理时间,并拥有500个等待工作其他行被归零,两者都有更多的流程来派遣他们的工作。在某一时刻, 导入 几乎消耗的处理时间,有高峰,有3000个工作等待,此时的一部分流程被解散为> < em>导入 为了尽快减少它。
情况下的问题在于,平衡将使队列执行 book 和 images 甚至通过必须将过程移至 导入 。为了解决这个问题,我们必须将我们的主管1分为两分,一个负责执行队列的工作,并在较短的等待中处理时间和数量元素,而另一个则用更长的处理时间和等待工作的排队,如图所示下图。
在这个新模型中,队列 默认 , mail 和 import <> 每个过程中至少有一个过程,所有过程中的所有过程的总和均在四个四个过程中,在这里,我们还定义了这些队列的超时,这些排队的超时为240秒,在失败前3次尝试耐受。该结构可确保平衡将根据需要分配一次性过程。
其他行将具有最高的超时流程,以防止平衡从事如此多的处理的人的流程,并且队列在该州有很多工作损害了该应用程序的操作。
定义与redis的联系
queue.php file ©负责定义数据库连接在laravel中的排队方式,在此文件中,我们定义为REDIS应将监视的行连接到地平线,文件将具有以下格式。请注意,在Paramento retry_after 我定义连接将打开多长时间。
'connections' => [
//outras conexões
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'retry_after' => 600,
],
],
标签的力量
使用Laravel Horizon所带来的所有优点,对我来说,最好的是使用监视标签。与他们一起,我们可以监督执行的行,作业和模型,允许知道什么是成功或失败,执行次数以及哪一行属于该作业。
通过模式,地平线将标签属于接收模型的每个作业,例如,如果我们有负责将新书添加到系统的导入行,则插入行中的每本书都会在行中创建以下标签。 strong>应用程序/书籍:id'其中 id 在您的数据库表中指示该书的书。
此行为具有其价值,但仅在整个队列收到特定模型的系统中,对于更复杂的情况,我更喜欢手动创建标签,因为可以广泛了解队列/作业并找到短暂的看法 - 术语失败。
标签的方法
要在每个作业中手动创建标签,使您的搜索更宽。
想象一下,在图书馆系统中,有一个名称 sewreturnalert 负责发送警报电子邮件,以便通常在3天内返回书籍的通常返回书籍的构造功能将具有以下格式。public function __construct(int $userId, int $bookId) {
$this->userId = $userId;
$this->bookId = $bookId;
}
我在标签数组中使用的模式是将作业名称作为第一个元素,其后是关联模型的ID,并放置了最后处理作业的行名,在此示例中,我们将具有以下结果。
public function tags() {
return ['SendReturnAlert','User:'. $this->userId,'Book:'. $this->bookId, 'default'];
}
从现在开始,我们可以在书籍,书籍或排队中搜索其在工作中是否起源 sewreturnalert 。因此,在失败的情况下,我们可以确定问题是否起源于作业的写作,享受的任何数据,书中的某些信息或排队中的某些信息。
usando命令
在许多情况下,我们需要重新处理失败的作业,在橙色地平线的另一个接口中,可以手动执行动作,这不是很恶毒,但可以解决非常准时的情况。一种更实用和狂热的方法实施是创建一个访问所有失败作业和重新处理的Command。
在这里尚未提及的东西,需要对存储在地平线上的数据的持久性进行解释,在 config/horizon.php 最近失败,失败和监控工作。我们有以下系统配置。
'trim' => [
'recent' => 60,
'completed' => 60,
'recent_failed' => 10080,
'failed' => 10080,
'monitored' => 10080,
],
此处的数字表示分钟中的持续时间,可以根据其应用的需求进行自定义,但是重要的是,您必须知道,越大,该值越大,大小越大。被Redis专辑占据。在情况下,我突破地平线以立即损害队列的全部功能,因此损害了应用程序。
通过创建命令,我们更改了您的签名,以作为可选仪表接收我们要重新处理的作业名称,因此,当我们运行命令而没有它的情况下 all 失败的作业将被重新处理。此版本是由Kodeas
的帖子创建的
protected $signature = 'horizon:retry-failed-jobs {jobName?}';
在我们的构造函数中,我们收到 jobpository 作为帕拉诺(Parano),这无非是Laravel Horizon创建的接口,可以访问Horizon处理的所有作业的所有信息,这就是结果。 br>
public function __construct(JobRepository $jobs) {
parent::__construct();
$this->jobs = $jobs;
}
使用接口,我们获得了所有失败的作业的数组,从中我们可以将每个作业的特定信息作为其ID,名称,已处理的行,日期失败的行。由您选择过滤工作,如果以parano的身份将其通过名称偏爱。
我们还使用 retryfailedjob 类来重新处理失败的作业, deletefailed 函数来删除失败的作业,如下所示。
public function handle() {
$jobName = $this->argument('jobName');
$failedJobs = $this->jobs->getFailed();
if($jobName != NULL) {
foreach ($failedJobs as $failedJob) {
if (preg_match("/$jobName/i", $failedJob->name) ) {
$id = $failedJob->id;
dispatch(new RetryFailedJob($id));
$this->jobs->deleteFailed($id);
}
}
} else {
foreach ($failedJobs as $failedJob) {
$id = $failedJob->id;
dispatch(new RetryFailedJob($id));
$this->jobs->deleteFailed($id);
}
}
}