1
Jeyfang 2021-02-02 13:50:21 +08:00
队列如果遇到退出信号,等待直到将当前正在处理的消息处理完之后再退出
|
2
ruanimal 2021-02-02 14:36:44 +08:00
|
3
AlanLeung2018 2021-02-02 14:40:41 +08:00
think-queue+supervisor,平滑重启的,任务不受影响
|
4
awanganddong OP @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
awanganddong OP @ruanimal 你的思路是直接用 supervisor 信号,这个我可以研究下
|
6
keepeye 2021-02-02 16:15:48 +08:00
supervisord 会向你的进程发送 SIGTERM 信号,自己捕获一下,做一下扫尾工作然后优雅退出即可
|
7
SjwNo1 2021-02-02 16:18:07 +08:00
我一般半夜处理 (逃
|
8
awanganddong OP @keepeye 用信号大概知道,但是具体到落地就是另外一回事了。
|
9
keepeye 2021-02-02 16:28:41 +08:00
@awanganddong 因为不知道你具体是什么程序,只能参照 php 文档了
https://www.php.net/manual/en/function.pcntl-signal.php 示例还是很清晰的,关键在于理解 declare(ticks = 1); |
10
awanganddong OP 项目用的是 laravel 框架。
然后守护进程直接用 supervisor 你给我的方案在于手动去实现一个守护进程,这样的话,我用 supervisor 就没意义了。 难道我想歪了吗 |
11
awanganddong OP 我刚开了下 laravel 文档
重启不依托于 supervisorctl 下边这条指令可以 php artisan queue:restart |
12
keepeye 2021-02-02 16:39:08 +08:00
@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 能完成正在处理的任务 |
13
Jeyfang 2021-02-02 17:07:01 +08:00
@awanganddong 看看你测试的脚本 LogInfo('testJob', $i)第一次到底执行到了哪里就结束了,结合楼上老哥说的 stopwaitsecs,是不是被中途中断然后重启又运行该任务
|
14
awanganddong OP 那就可以确定了 是 stopwaitsecs 这个值设置的时间过短的问题。
谢谢各位了 |
15
owenzhang24 2021-02-03 14:19:48 +08:00
|
16
awanganddong OP 补充下吧,
在 job 中,首先要限制任务的的超时时间,以及任务怎么可以停止。 超时时间通过 pcntl 控制,任务停止可以通过存 redis 时间戳控制。 |