【发布时间】: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),这样你就不会增加实际工作的不必要延迟了很长时间
标签: php laravel laravel-5 queue amazon-sqs