laravel修改retry_after/expire解决队列任务过期/超时导致队列多次执行问题
Song •
8655 次浏览 •
0个评论 •
2018年05月04日
在生产环境中,我发现当客户上传几万数据时,处理时间一般比较长(由于数据结构大,大约几分钟);我发现Laravel队列不报错但是执行了3次(我的异常尝试次数最多为3次),但是系统并未报错,我开始排查队列不报错但是多次执行的原因,发现存在队列过期的问题,修改retry_after解决问题。如果你是laravel 5.3以下环境,修改expire即可(Redis队列)。
任务过期
config/queue.php配置文件里,每一个队列连接都定义了一个retry_after选项。这个选项指定了任务最多处理多少秒后就被当做失败重试了。比如说,如果这个选项设置为90,那么当这个任务持续执行了90秒而没有被删除,那么它将被释放回队列。通常情况下,你应该把 retry_after 设置为最长耗时的任务所对应的时间。
唯一没有
retry_after选项的连接是Amazon SQS。当用Amazon SQS时,你必须通过Amazon命令行来配置这个重试阈值。
队列处理器超时
queue:work Artisan命令对外有一个--timeout选项。这个选项指定了Laravel队列处理器最多执行多长时间后就应该被关闭掉。有时候一个队列的子进程会因为很多原因僵死,比如一个外部的HTTP请求没有响应。这个--timeout选项会移除超出指定事件限制的僵死进程:
php artisan queue:work --timeout=60
retry_after配置选项和--timeout命令行选项是不一样的,但是可以同时工作来保证任务不会丢失并且不会重复执行。
--timeout应该永远都要比retry_after短至少几秒钟的时间。这样就能保证任务进程总能在失败重试前就被杀死了。如果你的--timeout选项大于retry_after配置选项,你的任务可能被执行两次。
更多相关好文
-
laravel中distinct()的使用方法与去重 2017-09-11 -
Laravel将view缓存为静态html,laravel页面静态缓存 2021-10-09 -
[ laravel爬虫实战--基础篇 ] guzzle描述与安装 2017-11-01 -
[ 配置教程 ] 在ubuntu16.04中部署LNMP环境(php7+maridb且开启maridb远程以及nginx多域名访问 )并配置laravel环境 2017-07-18 -
微信公众号回复菜单点击回复文本 2025-10-24
热门文章
-
微信公众号回复菜单点击回复文本 2025-10-24 -
laravel+easywechat6出现No component_verify_ticket found以及修改缓存为redis 2025-09-09 -
nginx 服务器如何查看当前访问的域名 2025-06-10 -
ubuntu+nginx当服务器异常时微信/企业微信/抖音数据重复回调导致服务器崩溃怎么解决? 2025-05-30 -
Jquery使用xlsx实现批量导入Excel数据 2025-05-12

Ubuntu 22.04系统编译安装Nginx1.22教程