使用 Laravel 的消息队列处理异步任务,Redis 作为队列数据库,Supervisor 监控脚本异常中断并自动重启,这是 Laravel 处理队列任务的标准流程,但是实际中可能还会出现各种各样的问题,为了保证系统 可靠性 ,还要注意几个问题。
一、执行失败重试次数设置
一定要设置任务执行失败重试次数,避免无限失败重试,超过重试次数 Laravel 会默认写到失败任务表中,也可以自己写执行失败后续处理逻辑。
php artisan queue:work redis --tries=3
需要先执行以下命令创建数据表:
php artisan queue:failed-table php artisan migrate
二、程序异常的处理
有时候程序执行过程会发生异常,比如依赖其他接口,请求 HTTP 接口超时等等,如果不捕捉异常,那么当前这个队列就会中断不能继续运行下去,比如给 10000 个用户推送内容,需要依赖接口推送,如果中间的请求挂了就会影响到后面的推送。
这里的异常是指程序执行过程中发生的异常,不是指常驻进程挂掉,程序异常不一定导致常驻进程中断,况且进程中断有 Supervisor 监控并重启。
如捕获异常代码片段:
try { $r = $client->request('POST', '', [ 'query' => [ 'client_name' => 'filemail', 'client_version' => '1.0', 'client_sequence' => 0, 'uid' => 692934013,//119481237 'r' => 1508312484, ], 'body' => \GuzzleHttp\json_encode($body), ]); $result = $r->getBody()->getContents(); $result = json_decode($result, true); if ($result['result'] == 0) { info("sendMail fail:" . json_encode($result)); $this->pushLog($task['id'], $task['mail_id'], implode(',', $userIds), json_encode($result), 0); } else { Log::warning("sendMail fail:" . json_encode($result)); $this->pushLog($task['id'], $task['mail_id'], implode(',', $userIds), json_encode($result), $result['result']); } } catch (RequestException $e) { Log::warning('RequestException' . $e->getMessage()); } catch (Exception $e) { Log::emergency('Exception' . $e->getMessage()); }
三、修改代码记得重启 Supervisor
最后一点,修改了处理队列的程序,记得要重启 Supervisor,否则脚本不会生效。
参考链接
Laravel 官方文档 Queue 队列:
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。