大量队列任务总是 MaxAttemptsExceededException,怎么办?
一、异常信息:
在做拉取公众号粉丝数据的时候,我将任务都放入队列,一顿操作后遇到
Illuminate\Queue\MaxAttemptsExceededException: App\Jobs\SyncOfficialAccountUserJob has been attempted too many times or run too long. The job may have previously timed out. in /vendor/laravel/framework/src/Illuminate/Queue/Worker.php:599
二、程序思路
以一个15万粉丝的公众号举例,我的做法如下:
通过开放平台授权推送消息,触发事件
App\Listeners\SyncOfficialAccountUser
通过接口 user->list 取得openId 列表,一次拉取调用最多拉取10000个,一共要拉取15次;
然后每10000个按每500进行分块之后扔入队列等待执行,相当于每10000有20个任务,15万有300个任务;
$chunks = collect($data['data']['openid'])->chunk('500');
$chunks->each(function ($item, $key) {
SyncOfficialAccountUserJob::dispatch(['appId' => $this->authorizerAppid, 'list' => $item->toArray()]);
});
三、相关配置如下:
.env
QUEUE_CONNECTION=redis
config/horizon.php
'waits' => [
'redis:default' => 60,
],
'trim' => [
'recent' => 120,
'failed' => 10080,
'monitored' => 10080,
],
'fast_termination' => false,
'memory_limit' => 64,
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default'],
'balance' => 'simple',
'processes' => 15,
'tries' => 3,
],
],
四、执行结果
失败任务 258个,成功拉取85794个粉丝。
第一条完成时间:15:04:16,最后一条完成时间:16:26:07
五、换思路
在收到推送触发事件后将信息写入缓存,然后用定时任务去缓存中取数据,每次少量任务放入队列处理。
不知道这个可行不,有经验的朋友请留下你的脚印~~
谢谢了。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: