Laravel队列相关问题记录

经常遇到队列相关的问题,仅此自己记录一下

使用supervisor重启horizon之后代码未生效?

  1. 官方推荐部署不重启supervisor
    部署使用以下命令将优雅退出,之前会出现僵尸进程,目前不清楚是否还有这个问题
    php artisan horizon:terminate
  1. 必须停止supervisor,然后kill残留进程。然后再启动
# 停止所有服务
supervisorctl stop all

# kill进程
ps -ef | grep supervisor
kill -9 进程id
如果进程过多:
ps -ef |grep horizon:work |awk '{print $2}'|xargs kill -9

# 重新启动
supervisord -c /etc/supervisord.conf
supervisorctl reload
  1. 最近研究一种发送信号的方式,但不确定是否能避免问题
平滑重启 
supervisorctl signal hup xxx 

需要注意的一个配置 retry_after

在 config/queue.php 下有个配置redis => [ retry_after => 90]
这个配置什么意思呢? 假如你有一个队列任务耗时4-10秒,而retry_after配置为5,那么本次任务在5秒内没执行完,本次任务就会终止,重新推入队列重试。再次执行时如果5秒内执行完了。那么任务才会成功。所以这个配置需要注意: retry_after的配置时间一定要大于任务的执行时间

同一个服务器运行了多个项目需要配置 prefix

在文件config/horizon/prefix,也就是 .env 文件的 HORIZON_PREFIX
不同项目一定要配置不同的prefix,否则队列任务会混淆到一起

多谢群里老哥解答,我也只是照搬记录。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 16
颠倒的玉石

停止所有得任务很恐怖呀

3年前 评论
congcong (楼主) 3年前
颠倒的玉石 (作者) 3年前
congcong (楼主) 3年前
lufeijun1234

可以尝试用 systemctl 管理

3年前 评论
congcong (楼主) 3年前
lufeijun1234 (作者) 3年前

我也是你这么处理的,但不是每次都这样,比如说你设置了5个redis,1个mysql队列,

ps -ef | grep artisan

正常来说你会看到6条有关队列信息,

supervisor这个工具有的时候报错重启的时候会没有杀死以前的,这样你执行以上命令就会查到12条队列,

这样你重启的时候只会重启其中的6条,然而代码跑进来,会优先进入以前没有重启成功的队列,

我觉得你每次先看一下当前进程数,

然后 stop all 在查看进程数,在start all,这样起码会保持队列运行中的代码完整执行。

能力有限,为什么会重复生产队列进程我也没搞清楚。

3年前 评论

可以单独平滑重启某个任务的啊

3年前 评论
congcong (楼主) 3年前
congcong (楼主) 3年前
Timgle (作者) 3年前
陈先生

systemd天下第一

3年前 评论
giao哥

不是直接 php artisan queue:restart 平滑重启嘛

3年前 评论

我单独用的supervisord 重启没生效 我直接重启服务器才生效的

2年前 评论

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