V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
awanganddong
V2EX  ›  PHP

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

  •  
  •   awanganddong · 2021-02-02 11:53:34 +08:00 · 2956 次点击
    这是一个创建于 1150 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现公司队列是用 supervisor 守护的,

    修改队列里边的代码

    如果用 supervisorctl restart all

    这样就相当于重启队列

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

    大家遇到这种情况怎么处理
    16 条回复    2023-03-09 17:55:37 +08:00
    Jeyfang
        1
    Jeyfang  
       2021-02-02 13:50:21 +08:00
    队列如果遇到退出信号,等待直到将当前正在处理的消息处理完之后再退出
    AlanLeung2018
        3
    AlanLeung2018  
       2021-02-02 14:40:41 +08:00
    think-queue+supervisor,平滑重启的,任务不受影响
    awanganddong
        4
    awanganddong  
    OP
       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
        5
    awanganddong  
    OP
       2021-02-02 16:10:02 +08:00
    @ruanimal 你的思路是直接用 supervisor 信号,这个我可以研究下
    keepeye
        6
    keepeye  
       2021-02-02 16:15:48 +08:00
    supervisord 会向你的进程发送 SIGTERM 信号,自己捕获一下,做一下扫尾工作然后优雅退出即可
    SjwNo1
        7
    SjwNo1  
       2021-02-02 16:18:07 +08:00
    我一般半夜处理 (逃
    awanganddong
        8
    awanganddong  
    OP
       2021-02-02 16:24:46 +08:00
    @keepeye 用信号大概知道,但是具体到落地就是另外一回事了。
    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);
    awanganddong
        10
    awanganddong  
    OP
       2021-02-02 16:32:11 +08:00
    项目用的是 laravel 框架。

    然后守护进程直接用 supervisor

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

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

    重启不依托于 supervisorctl

    下边这条指令可以

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

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

    超时时间通过 pcntl 控制,任务停止可以通过存 redis 时间戳控制。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1989 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:20 · PVG 00:20 · LAX 09:20 · JFK 12:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.