PM2 部署项目,内存满了重启,项目内定时任务被中断的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Dnlyao
V2EX    Node.js

PM2 部署项目,内存满了重启,项目内定时任务被中断的问题

  •  
  •   Dnlyao 2024-08-06 10:56:08 +08:00 2422 次点击
    这是一个创建于 496 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想请教一下,这种怎么避免定时任务被中断。现在限制 512MB ,4 个进程,然后只在第一个进程跑定时任务。是使用 node-schedule 跑的。现在问题是不稳定,一个月有一两天会被打断,比如 2 点 0 分 0 秒的任务,刚进去任务,内存满载重启,重启后,定时任务不会继续。定时任务时汇总数据的。

    目前想到的 一,就是定时任务开启时,先数据库插入记录,如果状态未改变的,重启后,跑方法继续运行。现在怕的是插入数据库的时候被中断,导致还是不会继续任务。

    先不打算设置大一点的限制内存,因为服务器 4g ,有 docker 在上面跑着。

    15 条回复    2024-08-07 05:44:04 +08:00
    creazyrabbit
        1
    creazyrabbit  
       2024-08-06 11:18:53 +08:00
    在某个时间段多次检查状态呢
    Dnlyao
        2
    Dnlyao  
    OP
       2024-08-06 11:28:18 +08:00
    @creazyrabbit 那这个检查的也靠定时器来运作吗?如果少数应该可以,但是这个 sass 系统,生成报表记录有点多,也怕影响系统白天的使用。现在生成报表的全是挤在凌晨的时间。
    securityCoding
        3
    securityCoding  
       2024-08-06 11:30:06 +08:00   1
    做个重试策略,redis 写个 key
    Dnlyao
        4
    Dnlyao  
    OP
       2024-08-06 11:32:43 +08:00
    @securityCoding 谢谢,我查一下这个怎么弄
    crysislinux
        5
    crysislinux  
       2024-08-06 11:36:28 +08:00 via Android
    机器不会重启就用 crontab ,机器也不可靠就用外部的 cron 服务区去 call 你的服务。
    coolcoffee
        6
    coolcoffee  
       2024-08-06 11:47:25 +08:00   1
    机器应该不止 512MB 吧,这种情况适合用 MQ 消息队列来完成。

    比如定时任务产生消息到 RabbitMQ ,这个基本上是毫秒级别的不会被打断。然后有对应消费者开始处理任务,关掉自动 ack ,只有任务成功或者失败才去确认。这样消费者哪怕被杀死,下次重启还会拿到没有 ack 的消息继续跑。
    Dnlyao
        7
    Dnlyao  
    OP
       2024-08-06 11:47:58 +08:00
    @crysislinux 但是机器的 crontab 或者外部 cron 执行了,项目重启了,不是会一样结果吗?定时任务执行了,但是项目重启了被中断,中断后不会继续执行。
    Dnlyao
        8
    Dnlyao  
    OP
       2024-08-06 11:49:08 +08:00
    @coolcoffee 机器 4g ,pm2 分配每个进程限制内存 512MB ,开启了 4 个进程,负载均衡,定时器只在一个进程内运行。
    catinsides
        9
    catinsides  
       2024-08-06 11:49:51 +08:00   1
    pm2 里的程序只用来分配任务,费内存的任务换到 child_process 执行
    要不直接把 node-schedule 换成 bull
    Dnlyao
        10
    Dnlyao  
    OP
       2024-08-06 11:53:25 +08:00
    @catinsides 谢谢,我去看一下相关内容
    fengYH8080
        11
    fengYH8080  
       2024-08-06 12:05:41 +08:00   1
    3 楼的做法最简单了,在数据一致性的情况下,任务执行往 redis 写个 key ,完成 del 一下,进程 0 启动那里加个查询,拿到 redis 里的 key 执行对应的定时任务就可以了
    crysislinux
        12
    crysislinux  
       2024-08-06 13:43:54 +08:00   1
    @Dnlyao 如果你的期望是恢复任务,那启动的时候检查有没有没完成的任务好了。
    whp1473
        13
    whp1473  
       2024-08-06 15:11:04 +08:00
    重试呀,恢复后检查状态重试
    guiling
        14
    guiling  
       2024-08-06 15:19:12 +08:00
    1 任务开启数据库记录个标识,服务启动先检查是否有任务被中断,接着跑
    2 写个接口,重启后手动触发
    msg7086
        15
    msg7086  
       2024-08-07 05:44:04 +08:00
    如果加内存的成本比一个工程师的时间价值高,也可以考虑加 swap 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3124 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 11:28 PVG 19:28 LAX 03:28 JFK 06:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86