• 技术文章 >web前端 >js教程

    浅谈Nodejs中要怎么做定时任务

    青灯夜游青灯夜游2021-10-25 19:18:25转载57
    本篇文章给大家介绍一下Node定时任务的实现方法,希望对大家有所帮助!

    目前我们遇到了这样一个需求,每个用户都可以自定义定时推送,定时任务的时间配置由用户自己配置,随时修改,而不是传统的由服务器设定好时间跑定时任务。【推荐学习:《nodejs 教程》】

    如果是已知定时任务循环周期,那么Linux Crontab 定时任务即可实现。在node中也已经有相对成熟的方案。下面将我自己了解到的Node定时任务方案方案做一个介绍。

    egg框架提供的schduler定时任务

    egg是阿里旗下的Node企业级应用框架,它提供了一套机制给开发者优雅的编写定时任务,详细参考官方文档:https://eggjs.org/zh-cn/basics/schedule.html ,这里不对具体用法做详细阐述,只简单讲一下它的配置用法。

    1.静态定时任务,即定时周期,处理逻辑写死。

    2.动态配置定时任务,这种相对来说灵活一点,开发者可以通过配置文件控制定时任务周期。

    3.通过代码手动触发定时任务,我们可以根据一些逻辑判断是否触发定时任务。

    从上述三点看,egg提供的定时任务不能满足我们需要用户自行配置定时周期的需求,所以只能寻求其他方案,通过查询资料我们发现了node-schedule的库也提供了定时任务的功能。

    node-schedule

    在浏览了node-schudule的文档 https://www.npmjs.com/package/node-schedule 之后,他的用法如下:

    const schedule = require('node-schedule');
    
    const job = schedule.scheduleJob('42 * * * *', function(){
      console.log('The answer to life, the universe, and everything!');
    });

    是的,他支持自定义定时周期,可以满足我们的需求,可以作为我们的选择,Nice!

    继续浏览其他开发者的使用文章,发现有一个node-schedule的相关问题记录,简要说就是定时器在预定时间执行了2次,具体问题见原文:https://cnodejs.org/topic/5b58414b8d66b90b2b7384a7 。这是一个低概率的问题,我们没有去做验证,因为我们的需求,及时定时器执行两次,对我们的结果并没有影响,所以这不是阻碍我们使用它的障碍,有兴趣的同学可以去测测bug。

    写在最后

    最后这里是对我们自己项目定时定时任务解决方案的总结,不感兴趣的同学可略过。

    我们的后端就是用的egg框架,所以最后我们的解决方案是在agent进程中加了node-schdule的定时器,用户的定时器都会同步的agent进程中执行,目前我们的用户量不大,暂时只想到了这种解决方式,后续起量后可能会分布式部署后台。

    这会是一个问题,量大的话单进程跑也会是一个问题,并且egg本身不建议在agent进程中做太多业务相关的东西。还有个比较重要的是agent是辅助进程,一些work的公共工作实在agent中完成的,agent发生未捕获的错误不会退出重启,所以容错处理必须要做,而且要做好。

    更多编程相关知识,请访问:编程视频!!

    以上就是浅谈Nodejs中要怎么做定时任务的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:Nodejs 定时任务
    上一篇:Javascript怎么检查对象是否为空 下一篇:JavaScript如何获取HTML元素
    大前端线上培训班

    相关文章推荐

    • 手把手教你怎么正确快速的部署一个TS Node.js项目!• 趣味讲解Node.js中的回调函数(附示例)• 深入浅析Node.js中的断路器机制• 一文了解Node.js中的多进程模型• node.js和javascript有什么区别• 浅析Node.js+Winston库如何构建简单日志功能

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网