supervisor 守护进程热更新的时候大家怎么处理的

2021-02-02 11:53:34 +08:00
 awanganddong
现公司队列是用 supervisor 守护的,

修改队列里边的代码

如果用 supervisorctl restart all

这样就相当于重启队列

如果此时有执行的任务,就直接放弃了。。

大家遇到这种情况怎么处理
2982 次点击
所在节点    PHP
16 条回复
Jeyfang
2021-02-02 13:50:21 +08:00
队列如果遇到退出信号,等待直到将当前正在处理的消息处理完之后再退出
ruanimal
2021-02-02 14:36:44 +08:00
AlanLeung2018
2021-02-02 14:40:41 +08:00
think-queue+supervisor,平滑重启的,任务不受影响
awanganddong
2021-02-02 16:08:35 +08:00
@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--;
}

```
awanganddong
2021-02-02 16:10:02 +08:00
@ruanimal 你的思路是直接用 supervisor 信号,这个我可以研究下
keepeye
2021-02-02 16:15:48 +08:00
supervisord 会向你的进程发送 SIGTERM 信号,自己捕获一下,做一下扫尾工作然后优雅退出即可
SjwNo1
2021-02-02 16:18:07 +08:00
我一般半夜处理 (逃
awanganddong
2021-02-02 16:24:46 +08:00
@keepeye 用信号大概知道,但是具体到落地就是另外一回事了。
keepeye
2021-02-02 16:28:41 +08:00
@awanganddong 因为不知道你具体是什么程序,只能参照 php 文档了

https://www.php.net/manual/en/function.pcntl-signal.php

示例还是很清晰的,关键在于理解 declare(ticks = 1);
awanganddong
2021-02-02 16:32:11 +08:00
项目用的是 laravel 框架。

然后守护进程直接用 supervisor

你给我的方案在于手动去实现一个守护进程,这样的话,我用 supervisor 就没意义了。

难道我想歪了吗
awanganddong
2021-02-02 16:35:32 +08:00
我刚开了下 laravel 文档

重启不依托于 supervisorctl

下边这条指令可以

php artisan queue:restart
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 能完成正在处理的任务
Jeyfang
2021-02-02 17:07:01 +08:00
@awanganddong 看看你测试的脚本 LogInfo('testJob', $i)第一次到底执行到了哪里就结束了,结合楼上老哥说的 stopwaitsecs,是不是被中途中断然后重启又运行该任务
awanganddong
2021-02-03 09:07:30 +08:00
那就可以确定了 是 stopwaitsecs 这个值设置的时间过短的问题。

谢谢各位了
owenzhang24
2021-02-03 14:19:48 +08:00
awanganddong
2023-03-09 17:55:37 +08:00
补充下吧,
在 job 中,首先要限制任务的的超时时间,以及任务怎么可以停止。

超时时间通过 pcntl 控制,任务停止可以通过存 redis 时间戳控制。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/750563

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX