Laravel 队列 - 作业之间暂停

Posted

技术标签:

【中文标题】Laravel 队列 - 作业之间暂停【英文标题】:Laravel Queue - Pause between jobs 【发布时间】:2019-05-13 10:34:06 【问题描述】:

我想创建一个仅每 X 秒运行一次作业的队列 (AMAZON SQS)。因此,如果突然提交了 50 个作业,则最终排在队列中。队列监听器然后拉一个作业,做一些事情并等待 X 秒。之后,下一个作业被拉出。另一个 X 秒暂停。等等等等

对于队列侦听器,睡眠选项选项仅确定在没有新作业可用的情况下工作人员将“睡眠”多长时间。因此只有在队列中没有任何内容时它才会休眠。

或者我应该在我的 php 代码中添加一个 pause(x) 吗?

[编辑] 我刚刚使用 FIFO 和标准 AWS SQS 队列测试了 sleep 方法,这弄乱了整个队列。突然工作(成功)重新提交了 3 次,之后进入失败状态。此外,我的代码中给出的延迟(3-4 分钟)被忽略了,而是花了一分钟

<?php

namespace App\Jobs;

use App\City;

class RetrieveStations extends Job

protected $cities;

/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct ($cities)

    $this->cities = $cities;


/**
 * Execute the job.
 *
 * @return void
 */
public function handle()




    // code here
      doSomething()
      sleep(X);




【问题讨论】:

是的,没有其他合适的机制——延迟方法只是设置作业何时可用,而队列处理程序的 --sleep 参数仅适用于没有返回作业时的轮询.你可以更聪明一点,使用microtime 将你的睡眠值设置为 (x - ellapsed_time),这样你就不会增加实际工作的不必要延迟了很长时间 看看twitter.com/themsaid/status/1232547028380606464 【参考方案1】:

没错,你需要让你的php代码休眠,没有别的办法。

Php sleep

【讨论】:

啊,实际上睡眠不起作用。我刚刚对其进行了测试,队列管理器没有正确处理这些作业。它们仍在飞行中(在亚马逊 SQS 上),在 X 次尝试后它们被标记为失败。实际上,每次尝试都是成功的,因此作业被提交 X 次。另外,睡眠值也不一样。我将它设置在 3 到 4 分钟之间,但一分钟后,它已经从队列中占用了另一个作业。【参考方案2】:

我有完全相同的问题要解决。我正在使用 Laravel 5.8,但我不知道如何让队列工作人员在作业之间等待固定的时间。

我现在正在考虑使用计划任务来处理这个问题。我可以安排一个任务运行,比如说,每 5 分钟运行一次,然后运行以下工匠命令:

$schedule->command('queue:work --queue=emails --once')->everyFiveMinutes();

这将从队列中取出一项作业并运行它。不幸的是,对于作业的处理频率没有更精细的控制。

【讨论】:

以上是关于Laravel 队列 - 作业之间暂停的主要内容,如果未能解决你的问题,请参考以下文章

在作业中暂停队列

Laravel 队列作业不加载文件

Express 中的 Laravel 队列作业相当于啥?

生成为 Laravel 作业队列创建表的迁移?

Laravel:获取有关队列作业的详细信息

在使用数据库作为队列连接的 laravel 作业中。但是 queue:work 命令不触发队列?