线上环境 队列功能 驱动database 90S 必终止报错
1. 问题描述?#
线上环境使用 Supervisor,没有使用 Horizon 管理工具。 驱动:database 队列,超过 90S 以后就会报错即使任务已经失败,仍然在运行:
Illuminate\Queue\MaxAttemptsExceededException: App\Jobs\AiInstall has been attempted too many times. in /home/api/vendor/laravel/framework/src/Illuminate/Queue/Worker.php:785
Stack trace:
#0 /home/api/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(519): Illuminate\Queue\Worker->maxAttemptsExceededException()
#1 /home/api/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(429): Illuminate\Queue\Worker->markJobAsFailedIfAlreadyExceedsMaxAttempts()
#2 /home/api/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(389): Illuminate\Queue\Worker->process()
#3 /home/api/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(176): Illuminate\Queue\Worker->runJob()
#4 /home/api/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(138): Illuminate\Queue\Worker->daemon()
#5 /home/api/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(121): Illuminate\Queue\Console\WorkCommand->runWorker()
#6 /home/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\Queue\Console\WorkCommand->handle()
#7 /home/api/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#8 /home/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure()
#9 /home/api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod()
#10 /home/api/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\Container\BoundMethod::call()
#11 /home/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(208): Illuminate\Container\Container->call()
#12 /home/api/vendor/symfony/console/Command/Command.php(326): Illuminate\Console\Command->execute()
#13 /home/api/vendor/laravel/framework/src/Illuminate/Console/Command.php(178): Symfony\Component\Console\Command\Command->run()
#14 /home/api/vendor/symfony/console/Application.php(1081): Illuminate\Console\Command->run()
#15 /home/api/vendor/symfony/console/Application.php(320): Symfony\Component\Console\Application->doRunCommand()
#16 /home/api/vendor/symfony/console/Application.php(174): Symfony\Component\Console\Application->doRun()
#17 /home/api/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(201): Symfony\Component\Console\Application->run()
#18 /home/api/artisan(37): Illuminate\Foundation\Console\Kernel->handle()
#19 {main}
这是 Supervisor 配置:
[program:aiinstall]
process_name=%(program_name)s_%(process_num)02d
command=php /home/api/artisan queue:work --queue=aiinstall
autostart=true
autorestart=true
numprocs=1
redirect_stderr=true
stdout_logfile=/home/logs/log.log
我在 PHPstudy 本地操作,一个队列即使运行一个小时,仍然不会显示该报错
我尝试过在 config/queue.php 中修改驱动 database 的 retry_after 为 0
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'retry_after' => 0,
'after_commit' => false,
],
也尝试过在队列代码里面把 timeout 设置为 0
public $timeout = 0;
加入队列代码:
AiInstall::dispatch($request->all())->onConnection('database')->onQueue('aiinstall');
日志仍然显示的是 90 秒到了,立刻再 RUNNING 一次,即使 FAIL。不知道是什么情况,再 FAIL 之后,他仍然会执行完当前队列剩下的任务(我没有设置处理 FAIL,他已经在 failed_jobs 表里面了,还是会继续执行),因为这个任务是 sql 添加语句,会在 FAIL 之后的任务里还会出现相同的数据生成两条的情况。
日志图片如下所述:
当 $timeout 尝试设置过 36000S 时,当运行 90S 后,报错就是 time out 超时。。
我不太清楚这个 90 秒到底是什么地方出现了问题,求赐教,谢谢。
推荐文章: