Laravel-SQS fifo 队列 - 作业处理正常但仍在运行并失败
Laravel-SQS fifo queue - jobs process fine but stay in flight and fail
为了限制来自队列的作业数量,我在 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 队列?我没有任何其他选项来限制队列中的作业....
作业的默认超时时间为 60 秒。一旦达到超时,工作人员将被杀死,作业 returns 进入队列,除非已达到最大尝试次数,在这种情况下,作业将失败。
您可以在队列工作人员级别或作业级别增加作业的超时时间。
如果要增加队列工作者的超时时间,请在命令行中指定超时时间:
php artisan queue:work --timeout=300
如果要增加特定作业的超时时间,请在作业上设置 $timeout
属性 class:
public $timeout = 300;
然而,下一个问题是Default Visibility Timeout
。由于它仅设置为 30 秒,因此该作业将再次在队列中可用,并且另一个工作人员可以拿起它并 运行 它。如果你只有一名工人,这不是什么大问题。但是,您现在就想修复它,这样您以后就不会 运行 在决定添加更多工作人员时遇到问题。
Default Visibility Timeout
应该比您期望的任何工作的最长时间要长 运行。所以,如果 $timeout
是 300,那么 Default Visibility Timeout
应该 > 300。
为了限制来自队列的作业数量,我在 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 队列?我没有任何其他选项来限制队列中的作业....
作业的默认超时时间为 60 秒。一旦达到超时,工作人员将被杀死,作业 returns 进入队列,除非已达到最大尝试次数,在这种情况下,作业将失败。
您可以在队列工作人员级别或作业级别增加作业的超时时间。
如果要增加队列工作者的超时时间,请在命令行中指定超时时间:
php artisan queue:work --timeout=300
如果要增加特定作业的超时时间,请在作业上设置 $timeout
属性 class:
public $timeout = 300;
然而,下一个问题是Default Visibility Timeout
。由于它仅设置为 30 秒,因此该作业将再次在队列中可用,并且另一个工作人员可以拿起它并 运行 它。如果你只有一名工人,这不是什么大问题。但是,您现在就想修复它,这样您以后就不会 运行 在决定添加更多工作人员时遇到问题。
Default Visibility Timeout
应该比您期望的任何工作的最长时间要长 运行。所以,如果 $timeout
是 300,那么 Default Visibility Timeout
应该 > 300。