Laravel-SQS FIFO队列-作业处理正常,但仍在飞行中并失败

时间:2018-12-23 13:53:46

标签: laravel amazon-sqs laravel-queue

为了限制来自队列的作业数量,我在PHP作业文件中引入了一些代码。推完工作后,我睡了一段时间:

// random nr between 3 and 4 min
$r = rand(180, 240);
sleep($r);

我正在使用的队列是SQS FIFO队列,提交的作业就可以了。我的工作人员仅使用一个进程并尝试3次:

more aws-worker.conf
command=php /var/www/html/website/artisan queue:work sqs_aws --sleep=5 --tries=3
autostart=true
autorestart=true
user=root
numprocs=1

但是,当我提交2个作业时,队列工作人员大约在1分钟后将其释放,但不会在SQS上将其删除。因此,它们仍保持飞行状态,并在3次失败标签后获得:

[2018-12-23 13:21:54] Processing: App\Jobs\DispatchAwsGatewayJob
[2018-12-23 13:22:56] Processing: App\Jobs\DispatchAwsGatewayJob

[2018-12-23 13:27:55] Processing: App\Jobs\DispatchAwsGatewayJob
[2018-12-23 13:29:01] Processing: App\Jobs\DispatchAwsGatewayJob

[2018-12-23 13:34:00] Processing: App\Jobs\DispatchAwsGatewayJob
[2018-12-23 13:35:06] Processing: App\Jobs\DispatchAwsGatewayJob

[2018-12-23 13:40:05] Processing: App\Jobs\DispatchAwsGatewayJob
[2018-12-23 13:40:05] Failed:     App\Jobs\DispatchAwsGatewayJob

[2018-12-23 13:41:10] Processing: App\Jobs\DispatchAwsGatewayJob
[2018-12-23 13:41:10] Failed:     App\Jobs\DispatchAwsGatewayJob

其他一些队列详细信息:

Default Visibility Timeout: 30 seconds
Message Retention Period:   4 days
Receive Message Wait Time:  0 seconds

睡眠代码是否可能干扰fifo队列?我没有其他选择可以限制队列中的作业。...

1 个答案:

答案 0 :(得分:1)

作业的默认超时为60秒。一旦达到超时,工作人员将被杀死,并且作业将返回队列,除非达到最大尝试次数,否则作业将失败。

您可以在队列工作者级别或作业级别增加作业的超时时间。

如果要增加队列工作器的超时,请在命令行上指定超时:

php artisan queue:work --timeout=300

如果要增加特定作业的超时时间,请在作业类别上设置$timeout属性:

public $timeout = 300;

但是,下一个问题是Default Visibility Timeout。由于仅将其设置为30秒,因此该作业将再次在队列上可用,并且其他工作人员可以接管并运行该作业。如果您只有一个工人,这不是什么大问题。但是,您现在要修复它,这样以后再决定添加更多工作人员时就不会遇到问题。

Default Visibility Timeout应该高于您希望任何作业运行的最长时间。因此,如果$timeout为300,则Default Visibility Timeout应该为> 300。