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

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

先不打算设置大一点的限制内存,因为服务器 4g ,有 docker 在上面跑着。
举报· 127 次点击
登录 注册 站外分享
9 条回复  
creazyrabbit 初学 2024-8-6 11:18:53
在某个时间段多次检查状态呢
securityCoding 初学 2024-8-6 11:30:06
做个重试策略,redis 写个 key
crysislinux 小成 2024-8-6 11:36:28
机器不会重启就用 crontab ,机器也不可靠就用外部的 cron 服务区去 call 你的服务。
coolcoffee 小成 2024-8-6 11:47:25
机器应该不止 512MB 吧,这种情况适合用 MQ 消息队列来完成。

比如定时任务产生消息到 RabbitMQ ,这个基本上是毫秒级别的不会被打断。然后有对应消费者开始处理任务,关掉自动 ack ,只有任务成功或者失败才去确认。这样消费者哪怕被杀死,下次重启还会拿到没有 ack 的消息继续跑。
catinsides 小成 2024-8-6 11:49:51
pm2 里的程序只用来分配任务,费内存的任务换到 child_process 执行  
要不直接把 node-schedule 换成 bull
fengYH8080 小成 2024-8-6 12:05:41
3 楼的做法最简单了,在数据一致性的情况下,任务执行往 redis 写个 key ,完成 del 一下,进程 0 启动那里加个查询,拿到 redis 里的 key 执行对应的定时任务就可以了
whp1473 小成 2024-8-6 15:11:04
重试呀,恢复后检查状态重试
guiling 小成 2024-8-6 15:19:12
1 任务开启数据库记录个标识,服务启动先检查是否有任务被中断,接着跑
2 写个接口,重启后手动触发
msg7086 小成 2024-8-7 05:44:04
如果加内存的成本比一个工程师的时间价值高,也可以考虑加 swap 。
返回顶部