记录一次 laravel 项目队列拥堵的问题

2022-12-29 18:07:29 浏览数 (1)

项目的队列使用database 作为队列驱动,在任务入队之后发现并未生效。所以对问题进行排查。

  1. 首先查看 failed_jobs 表,发现并没有失败的任务生成记录,然后查看jobs 表,发现确实已经入了 jobs 表的记录。 查看项目日志,如下
代码语言:javascript复制
Numeric value out of range: 1264 Out of range value for column 'attempts' at row 1 
(SQL: update `yn_jobs` set `reserved_at` = 1585808364, `attempts` = 256 where `id` = 1331)
 in /usr/local/nginx/html/yinuo-crm-api/vendor/illuminate/database/Connection.php:664

发现是由于尝试次数引起的,查看对应id 的数据库记录,查看payload 字段,

代码语言:javascript复制
{"displayName":"App\Jobs\OrderMark","job":"Illuminate\Queue\CallQueuedHandler@call","maxTries":null,"timeout":null,"data":{"commandName":"App\Jobs\OrderMark","command":"O:18:"App\Jobs\OrderMark":5:{s:10:"u0000*u0000orderid";i:13658;s:6:"u0000*u0000job";N;s:10:"connection";N;s:5:"queue";N;s:5:"delay";i:21820635;}"}}

发现maxTries 和timeout 字段都是null,这个时候该任务会无限期执行,导致队列堵塞。 找到问题,进行解决,在对应的job 文件下添加最大尝试次数的参数

代码语言:javascript复制
class DataMark extends Job {
    public $tries = 5;   //添加最大尝试次数
    .....
	public function __construct($datas){
	.......
	}
	public function handle(){
	    	.......
		return true;
	}
}

最后删掉那条一直在重试的任务,新入队的任务都有重试次数的限制了,不会出现一直重试导致拥堵的情况啦。

0 人点赞