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)——定时任务的进化史
一.纯手工 公司主营的是直播业务,会很许多打榜活动,也就是按主播收到的礼物或收益进行排序,排在前面的会有相应奖励. 纯手工时代,每接到一个活动,就重新写一份,第一次写完.之后就是复制黏贴,再修改,每次 ...
随机推荐
- 【鸿蒙应用开发】第三章 “颜控”时代下如何构建UI界面
为什么是第三章,前面两章呢? 原本是以碎片化的方式将HarmonyOS应用开发快速掌握,但是在准备六大布局组合复杂UI界面Demo时,很多组件之前都没有应用.因此准备将知识体系进行细化,以章节的形式希 ...
- 这 6 个 Spring Boot 项目够经典
不得不佩服 SpringBoot 的生态如此强大,今天我给大家推荐几款 Gitee 上优秀的后台管理系统,小伙伴们再也不用从头到尾撸一个项目了. SmartAdmin 我们开源一套漂亮的代码和一套整洁 ...
- 排序--MergeSort 归并排序?
MergeSort 's implementation MergetSort 的中心思想就是分治思想,通过解决每一个小问题来解决大问题 假设你有2个已经排好序的数组 数组[ 4 ][ 8 ] 和 数组 ...
- Linux 硬盘挂载及开机挂载
一.分区 主分区.扩展分区.逻辑分区的区别 主分区:包含操作系统启动所必需的文件和数据的硬盘分区,如需在硬盘上安装操作系统,该硬盘必须得有一个主分区 扩展分区:除主分区外的分区,不能直接使用,必须再划 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中主窗口对象dockNestingEnabled属性
dockNestingEnabled 属性是确认主窗口的浮动部件(dock widget)是否允许嵌套的一个属性. 如果此属性为False,则浮动部件停靠区域只能包含一个浮动部件(水平或垂直).如果此 ...
- ADF 第一篇:Azure Data Factory介绍
Azure Data Factory(简写 ADF)是Azure的云ETL服务,简单的说,就是云上的SSIS.ADF是基于云的ETL,用于数据集成和数据转换,不需要代码,直接通过UI(code-fre ...
- 课堂练习之疫情APP
title: 课堂练习之疫情查询APP date: 2020-03-17 20:08:51 tags: 在之前的体温记录APP上改进,只写出疫情信息查询页面的代码. 实体类与上篇博客SSM整合中的Ci ...
- IKUN python 反序列化
题目过程1.一开始提示说要买到V6,观察源码,发现/static/img/lv/lv4.png.注册之后尝试寻找V6.观察url发现/shop?page=2.尝试写脚本匹配一下.发现在第181页. i ...
- RocketMQ开发者指南
1. 概念和特性 概念:介绍RocketMQ的基本概念模型 1 消息模型(Message Model) RocketMQ主要由 Producer.Broker.Consumer 三部分组成,其中Pro ...
- 华大MCU单片机之HC32F003/HC32F005 hc32f005_ddl_Rev1.9.0 Lite精简版库使用心得
之前几个项目开发都是用的华大HC32F003_DDL_Rev1.0.2的库函数,今年刚开始入手华大,刚开始不是很了解这个芯片,看到库能用就上手了.这个版本的库编译效率很低,16K的芯片一下就写爆了.后 ...