使用 Laravel 消息队列要注意的问题

使用 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,否则脚本不会生效。

后续还有的话会继续补充,原文链接:https://blog.tanteng.me/2017/12/laravel-qu...

参考链接

Laravel 官方文档 Queue 队列:

https://learnku.com/docs/laravel/5.5/queues

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 2

1.php artisan queue:restart

  1. try catch 后 --tries 用来干嘛?
6年前 评论

最后一点,修改了处理队列的程序,记得要重启 Supervisor,否则脚本不会生效

这一点好像不对吧 并不是重启Supervisor 而应该是执行 php artisan queue:restart

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!