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

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

  •  
  •   Dnlyao · 86 天前 · 1732 次点击
    这是一个创建于 86 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    比如定时任务产生消息到 RabbitMQ ,这个基本上是毫秒级别的不会被打断。然后有对应消费者开始处理任务,关掉自动 ack ,只有任务成功或者失败才去确认。这样消费者哪怕被杀死,下次重启还会拿到没有 ack 的消息继续跑。
    Dnlyao
        7
    Dnlyao  
    OP
       86 天前
    @crysislinux 但是机器的 crontab 或者外部 cron 执行了,项目重启了,不是会一样结果吗?定时任务执行了,但是项目重启了被中断,中断后不会继续执行。
    Dnlyao
        8
    Dnlyao  
    OP
       86 天前
    @coolcoffee 机器 4g ,pm2 分配每个进程限制内存 512MB ,开启了 4 个进程,负载均衡,定时器只在一个进程内运行。
    catinsides
        9
    catinsides  
       86 天前   ❤️ 1
    pm2 里的程序只用来分配任务,费内存的任务换到 child_process 执行
    要不直接把 node-schedule 换成 bull
    Dnlyao
        10
    Dnlyao  
    OP
       86 天前
    @catinsides 谢谢,我去看一下相关内容
    fengYH8080
        11
    fengYH8080  
       86 天前   ❤️ 1
    3 楼的做法最简单了,在数据一致性的情况下,任务执行往 redis 写个 key ,完成 del 一下,进程 0 启动那里加个查询,拿到 redis 里的 key 执行对应的定时任务就可以了
    crysislinux
        12
    crysislinux  
       86 天前   ❤️ 1
    @Dnlyao 如果你的期望是恢复任务,那启动的时候检查有没有没完成的任务好了。
    whp1473
        13
    whp1473  
       86 天前
    重试呀,恢复后检查状态重试
    guiling
        14
    guiling  
       86 天前
    1 任务开启数据库记录个标识,服务启动先检查是否有任务被中断,接着跑
    2 写个接口,重启后手动触发
    msg7086
        15
    msg7086  
       86 天前
    如果加内存的成本比一个工程师的时间价值高,也可以考虑加 swap 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4938 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:11 · PVG 09:11 · LAX 18:11 · JFK 21:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.