现公司队列是用 supervisor 守护的,
修改队列里边的代码
如果用 supervisorctl restart all
这样就相当于重启队列
如果此时有执行的任务,就直接放弃了。。
大家遇到这种情况怎么处理
修改队列里边的代码
如果用 supervisorctl restart all
这样就相当于重启队列
如果此时有执行的任务,就直接放弃了。。
大家遇到这种情况怎么处理
|
JeyfangFeb 2, 2021
1
队列如果遇到退出信号,等待直到将当前正在处理的消息处理完之后再退出
|
|
ruanimalFeb 2, 2021
2
|
|
AlanLeung2018Feb 2, 2021
3
think-queue+supervisor,平滑重启的,任务不受影响
|
|
4
@Jeyfang 刚才我试验了下。
在 laravel 队列执行过程中 supervisorctl restart test 然后出现了两个 testJob.time() 的文件,这也就说明任务出现重复执行的情况。 retry_after=86400 ``` $i = 10000000; while ($i) { if ($i == 10000000) { LogInfo('testJob' . time(), $i); } else { LogInfo('testJob', $i); } $i--; } ``` |
|
5
@ruanimal 你的思路是直接用 supervisor 信号,这个我可以研究下
|
|
keepeyeFeb 2, 2021
6
supervisord 会向你的进程发送 SIGTERM 信号,自己捕获一下,做一下扫尾工作然后优雅退出即可
|
|
SjwNo1Feb 2, 2021
7
我一般半夜处理 (逃
|
|
8
@keepeye 用信号大概知道,但是具体到落地就是另外一回事了。
|
|
keepeyeFeb 2, 2021
9
@awanganddong 因为不知道你具体是什么程序,只能参照 php 文档了
https://www.php.net/manual/en/function.pcntl-signal.php 示例还是很清晰的,关键在于理解 declare(ticks = 1); |
|
10
项目用的是 laravel 框架。
然后守护进程直接用 supervisor 你给我的方案在于手动去实现一个守护进程,这样的话,我用 supervisor 就没意义了。 难道我想歪了吗 |
|
11
我刚开了下 laravel 文档
重启不依托于 supervisorctl 下边这条指令可以 php artisan queue:restart |
|
keepeyeFeb 2, 2021
12
@awanganddong 我也翻了一下 laravel 文档,以及 github 上的一条 issue,我认为 laravel(5.6+)是能够正确处理 SIGTERM 信号的。
文档里有关于配置 supervisor 的说明: You should ensure that the value of stopwaitsecs is greater than the number of seconds consumed by your longest running job. Otherwise, Supervisor may kill the job before it is finished processing. 意思你配置 supervisor 的 stopwaitsecs 参数必须足够大,保证 worker 能完成正在处理的任务 |
|
JeyfangFeb 2, 2021
13
@awanganddong 看看你测试的脚本 LogInfo('testJob', $i)第一次到底执行到了哪里就结束了,结合楼上老哥说的 stopwaitsecs,是不是被中途中断然后重启又运行该任务
|
|
14
那就可以确定了 是 stopwaitsecs 这个值设置的时间过短的问题。
谢谢各位了 |
|
owenzhang24Feb 3, 2021
15
|
|
16
补充下吧,
在 job 中,首先要限制任务的的超时时间,以及任务怎么可以停止。 超时时间通过 pcntl 控制,任务停止可以通过存 redis 时间戳控制。 |