Laravel horizon 每次执行队列后,都会挂起一分钟,然后在执行下一个队列?
配置
'supervisor-mongo-1' => [
'connection' => 'redis',
'queue' => ['xxxx'],
'balance' => false,
'processes' => 1,
'tries' => 1,
'timeout' => 900,
]
刚开始不是间隔1分钟,之后每次执行完,都会挂起一分钟。
不知道有遇到这个类似问题的?
不会的 是redis指令阻塞配置
@arvin-hermit 为什么刚开始阻塞了10几秒,后来阻塞了一分钟,这不太符合逻辑
Horizon
中只有这一个队列嘛,如果有多个,可能是一个消费进程忙不过来,你可以多开几个消费进程试试,就是把process
调大一些@LiamHao 单进程消费,多的话对业务逻辑有影响。一个队列消费完后,这个进程应该是空闲的,不会出现忙不过来的情况。
@jcc123 我说的关键是有多个待消费的【队列】。比如你的系统有
order
、mail
、xxxx
三个待消费的队列,那么,如果你只允许开一个【消费进程】进行消费的话,而且你设置了三个队列有优先级,order
最高,xxxx
最低,那么xxxx
就会出现等待的情况。这唯一的一个【消费进程】需要先消费完order
和mail
队列中的任务,才会执行xxxx
中的任务。我在想,是不是这1分钟里,【消费进程】去处理别的队列了。@LiamHao 应该不是,这个进程里只监听一个队列。
@jcc123 那就是
xxxx
队列里的\App\Jobs\OrderSyncToMongo
任务,代码执行效率低。低到处理完一个任务需要1分钟时间。仔细看你的任务时间间隔,后面也有几秒就处理完的任务,所以,据我猜测,应该是任务里的代码执行时间问题,有的任务处理时间长,有的任务处理时间短。你可以在开发环境,修改.env
文件中的QUEUE_CONNECTION
参数,改为sync
,使用同步的方式,再观察几分钟任务的执行时间差异。而且你在config/horizon.php
中设置了timeout=900
,说名你的任务的确很耗时,否则一般不需要设置这个参数的。@LiamHao
同步的话
每次执行用了11秒左右的时间
与上方的队列执行时间差不大多
所以我怀疑是,horizon 有某种不稳定的问题,但又没办法证明它
@jcc123 嗯,我也看错了,确实是规律性的,任务耗时15秒左右,还是很稳定的。每个任务之间,又会出现45秒左右的等待。坐等大佬了:wa
看看是否跟这个参数有关系
队列《Laravel 8 中文文档》