Node.js躬行记(5)——定时任务的调试
最近做一个活动,需要用到定时任务,于是使用了 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)中,可随时读写。

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

为了让JSON数据的展示更友好,就需要格式化数据,也就是要有空格。
JSON.stringify(JSON.parse(record.content), null, 2)
二、错误查看困难
在测试环境或正式环境,如果定时任务处理的数据错误了,那么只能通过日志来排查。
而一台跑着的服务器中会有很多其他的定时任务,在测试环境中,为了能看清楚日志,可以只运行一个任务。
但是在正式环境中,是不能停止任务的,像目前运行的定时任务,可能几秒内就有几百行的日志,用肉眼观察有点累。
好在我们这边接入了阿里云的日志服务,可以查看日志控制台,里面有丰富的查询过滤条件,可以准确的定位到某条日志。

如果你有更好的调试方法,欢迎留言讨论。
三、应急处理
在线上运行的时候,可能会因为这个那个的问题导致任务没有在指定时间运行。
那么就得开放一个入口,来手动执行这个任务。
一开始的想法是写个临时接口,然后用postman手动访问,不过这样的话对运营不太友好,毕竟运营会有人半夜值班盯着活动,但开发人员是不会半夜还盯着服务器的。
于是又快速搭了个后台执行页面,有个下拉框可选择任务时间段,还有个运行按钮,到时候出问题的话,就手动运行一次。

Node.js躬行记(5)——定时任务的调试的更多相关文章
- Node.js躬行记(1)——Buffer、流和EventEmitter
一.Buffer Buffer是一种Node的内置类型,不需要通过require()函数额外引入.它能读取和写入二进制数据,常用于解析网络数据流.文件等. 1)创建 通过new关键字初始化Buffer ...
- Node.js躬行记(2)——文件系统和网络
一.文件系统 fs模块可与文件系统进行交互,封装了常规的POSIX函数.POSIX(Portable Operating System Interface,可移植操作系统接口)是UNIX系统的一个设计 ...
- Node.js躬行记(4)——自建前端监控系统
这套前端监控系统用到的技术栈是:React+MongoDB+Node.js+Koa2.将性能和错误量化.因为自己平时喜欢吃菠萝,所以就取名叫菠萝系统.其实在很早以前就有这个想法,当时已经实现了前端的参 ...
- Node.js躬行记(6)——自制短链系统
短链顾名思义是一种很短的地址,应用广泛,例如页面中有一张二维码图片,包含的是一个原始地址(如下所示),如果二维码中的链接需要修改,那么就得发代码替换掉. 原始地址:https://github.com ...
- Node.js躬行记(15)——活动规则引擎
在日常的业务开发中,会包含许多的业务规则,一般就是用if-else硬编码的方式实现,这样就会增加逻辑的维护成本,若无注释,可能都无法理解规则意图. 因为一旦规则有所改变,那么就需要修改代码再发布代码, ...
- Node.js躬行记(19)——KOA源码分析(上)
本次分析的KOA版本是2.13.1,它非常轻量,诸如路由.模板等功能默认都不提供,需要自己引入相关的中间件. 源码的目录结构比较简单,主要分为3部分,__tests__,lib和docs,从名称中就可 ...
- Node.js躬行记(21)——花10分钟入门Node.js
Node.js 不是一门语言,而是一个基于 V8 引擎的运行时环境,下图是一张架构图. 由图可知,Node.js 底层除了 JavaScript 代码之外,还有大量的 C/C++ 代码. 常说 Nod ...
- Node.js躬行记(23)——Worker threads
Node.js 官方提供了 Cluster 和 Child process 创建子进程,通过 Worker threads 模块创建子线程.但前者无法共享内存,通信必须使用 JSON 格式,有一定的局 ...
- Node.js躬行记(7)——定时任务的进化史
一.纯手工 公司主营的是直播业务,会很许多打榜活动,也就是按主播收到的礼物或收益进行排序,排在前面的会有相应奖励. 纯手工时代,每接到一个活动,就重新写一份,第一次写完.之后就是复制黏贴,再修改,每次 ...
随机推荐
- Java多线程中的wait/notify通信模式
前言 最近在看一些JUC下的源码,更加意识到想要学好Java多线程,基础是关键,比如想要学好ReentranLock源码,就得掌握好AQS源码,而AQS源码中又有很多Java多线程经典的一些应用:再比 ...
- Nebula Flink Connector 的原理和实践
摘要:本文所介绍 Nebula Graph 连接器 Nebula Flink Connector,采用类似 Flink 提供的 Flink Connector 形式,支持 Flink 读写分布式图数据 ...
- CAD插件
CAD插件使用: 1.首先得有插件,插件解压,放那个盘都可以,只要自己觉得放得下,注:(每次打开CAD想要用插件都要的步骤)打开CAD---AP回车----找到插件所在文件夹-------Ctrl+A ...
- Codeforces Round 665 (div2)
2020.8.22 装修完了我的博客,喜欢这个造型,挂上友链就更好了 昨天cf就是一个彻头彻尾的悲剧,本来能上蓝,结果因为在A题耽误时间过多导致掉了30分,不过没关系,这算是一个小波动吧,影响不了什么 ...
- moviepy音视频剪辑:视频半自动追踪人脸打马赛克
一.引言 在<moviepy1.03音视频剪辑:使用manual_tracking和headblur实现追踪人脸打马赛克>介绍了使用手动跟踪跟踪人脸移动轨迹和使用headblur对人脸进行 ...
- Scrum 冲刺第五天
一.每日站立式会议 1.会议内容 1)进行每日工作汇报 张博愉: 昨天已完成的工作:学习如何编写测试计划 今日工作计划:学习如何编写用户手册 工作中遇到的困难:写文档也有很多讲究的点,花了很多时间 张 ...
- 单次期望 O(1) 的RMQ
膜万弘,太强了!!! 刚刚变态的zjjws想要将一个需要 \(RMQ\) 问题的时间和空间都卡成 \(O(n)\) ,就在可怜的蒟蒻 Point_King 一筹莫展之时万弘他出现了,给予了本蒟蒻光明和 ...
- Codeforces Edu Round 58 A-E
A. Minimum Integer 如果\(d < l\),则\(d\)满足条件 否则,输出\(d * (r / d + 1)\)即可. #include <cstdio> #in ...
- 题解-Koishi Loves Construction
题解-Koishi Loves Construction 前缀知识 质数 逆元 暴搜 Koishi Loves Construction 给定 \(X\),\(T\) 组测试数据,每次给一个 \(n\ ...
- redis学习之——redis.conf配置(基本)文件学习
# Redis configuration file example # Note on units: when memory size is needed, it is possible to sp ...