开发者社区> 咖啡机(K.F.J)> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Node.js躬行记(5)——定时任务的调试

简介:  最近做一个活动,需要用到定时任务,于是使用了 node-schedule 库。
+关注继续查看

  最近做一个活动,需要用到定时任务,于是使用了 node-schedule 库。

  用法很简单,就是可配置开始、结束时间,以及重复执行的时间点,如下所示,从2020-12-23T09:00:00Z开始,每10分钟执行一次,直至2020-12-23T09:30:30Z结束。

schedule.scheduleJob({ 
  start: '2020-12-23T09:00:00Z', 
  end: '2020-12-23T09:30:30Z', 
  rule: '* */10 * * * *' 
}, test);


一、时间修改困难


  如果是需要在未来某个时间段执行的定时任务,那么要还原真实场景,就得修改服务器时间。

  测试环境虽然可以改时间,但是我们这边是几个组共用几台服务器,修改了时间后,可能会影响其他组的业务,并且正式环境的时间是不能修改的。

  一开始测试的时候,改过几次时间,改时间毕竟太繁琐,每次代码发布,服务器的时间就又会重置,又要修正一次,还收到了其他组的投诉。

  后面就改成今天的时间段,这次的定时任务的时间段有7个,每次修改好后,就要提交一遍代码,然后合并分支,最后发布一下代码,服务也会重新启动。

  这种纯手工方式过于费时,后面想到可以在后台做个通用配置(下图是个配置列表),将这些常量(例如时间参数)存在数据库(例如MongoDB或MySQL)中,可随时读写。

   

91.png


  通用配置还有一个比较常见的场景,那就是测试的时候,在线修改可配置的参数。例如有个活动,里面有个任务是观看直播30分钟,而测试的时候不可能等到30分钟后,查看效果。在测试的时候可以调整成2分钟,如果这些参数写死在代码中,那么就需要重发代码,而保存在通用配置中的话,就不用重发代码了。

  下图是个增和改的弹框,在新增的时候需要格式化多行文本中的JSON数据,先用 eval(),再用JSON.stringify(),这样的话在调用JSON.parse()的时候就不会出错。

JSON.stringify(eval(`(${values.content})`))


92.png


  为了让JSON数据的展示更友好,就需要格式化数据,也就是要有空格。

JSON.stringify(JSON.parse(record.content), null, 2)


二、错误查看困难


  在测试环境或正式环境,如果定时任务处理的数据错误了,那么只能通过日志来排查。

  而一台跑着的服务器中会有很多其他的定时任务,在测试环境中,为了能看清楚日志,可以只运行一个任务。

  但是在正式环境中,是不能停止任务的,像目前运行的定时任务,可能几秒内就有几百行的日志,用肉眼观察有点累。

  好在我们这边接入了阿里云的日志服务,可以查看日志控制台,里面有丰富的查询过滤条件,可以准确的定位到某条日志。


93.png


  如果你有更好的调试方法,欢迎留言讨论。


三、应急处理


  在线上运行的时候,可能会因为这个那个的问题导致任务没有在指定时间运行。

  那么就得开放一个入口,来手动执行这个任务。

  一开始的想法是写个临时接口,然后用postman手动访问,不过这样的话对运营不太友好,毕竟运营会有人半夜值班盯着活动,但开发人员是不会半夜还盯着服务器的。

  于是又快速搭了个后台执行页面,有个下拉框可选择任务时间段,还有个运行按钮,到时候出问题的话,就手动运行一次。


94.png



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JavaSE——为什么重写equals的同时一定要重写hashCode?
JavaSE——为什么重写equals的同时一定要重写hashCode?
22 0
Node.js躬行记(3)——命令行工具
  创建一个空目录,然后通过npm init命令初始化package.json文件,并按提示输入相关信息或直接回车使用默认信息,生成的内容如下所示。
28 0
MySQL定时任务
原文:MySQL定时任务 一、简介: Mysql属于中小型数据库系统,它的事件调度器Event Scheduler是在mysql 5.1才开始引入事件调度器是在 MySQL 5.1 中新增的另一个特色功能,可以作为定时任务调度器,取代部分原先只能用操作系统任务调度器才能完成的定时功能。
1181 0
mysql 定时任务
引用:http://www.dewen.org/q/1410    mysql5.5 可以执行 一、查看event是否开启 show variables like '%sche%'; 开启event_schedulerset global event_scheduler =1; 二、创建存储...
640 0
Node.js调用mysql的存储过程
例子仅在windows下测试通过,没有放在linux下测试。如有问题,可以电邮给我~ 1、安装node.js、mysql,此处略(自行搜索吧)…; 2、创建一个名为test的数据库,然后建一张名为user_info的表(仅供测试)… 这里假定mysql使用的用户名为root,密码为123456 相应...
1015 0
Jash-跨浏览器的Javascript命令行调试工具
Jash是一个基于DHTML开发的命令行JavaScript调试工具,用于调试当前打开的页面。通过该调试工具,你可以快速的进行脚本调试,查看dom、当前页面对象,函数、变量,跟踪执行堆栈,执行任意脚本及为页面定义css等,可运行于IE6+ 、FF1.5+、Safari 3 +下。
748 0
+关注
咖啡机(K.F.J)
每天进步一点点 研磨生活的香甜
350
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载