错误排查
每隔7天执行也能写错?

事情经过

  1. 博客需要实现【上线后每7天更新‘新增浏览量’】的功能
  2. node端使用了【node-schedule】模块实现定时任务:
const schedule = require('node-schedule');
const job = schedule.scheduleJob('* * * 7 * *', function(){
  postReflash.updateView() // 更新浏览量
});
  1. 本月8日起床发现自己站点挂了,登录控制台一看,cpu满了,内存满了,TCP连接数很高,最糟糕的是,服务器都连不上了。
  2. 我简单的认为是被DOSS攻击了。

复盘总结

  • 这里总共犯了三处错误。
  1. 不了解【node-schedule】的cron表达式达到的实际执行效果(根本原因)
  2. 云服务器没有设置监控的预警
  3. 没有排查就自认为是被攻击了

cron

  • 实现【每7天执行一次】能用* * * 7 * * 吗?--理解错误:以为会每隔7秒执行

在代码我尝试了7 * * * * * ,本地执行的是每分钟的第七秒执行,如:

2022/04/15 18:00:07
2022/04/15 18:01:07
2022/04/15 18:02:07
...

也就是说 * * * 7 * * ,应该理解为:每年每月的7号的每小时每分钟每秒执行

2022/04/07 00:00:01
2022/04/07 00:00:02
2022/04/07 00:00:03
...
2022/04/07 23:59:59
  • 结果就是服务器没撑住爆了
拓展

q: 那么用什么表达式能实现【每7天执行一次】呢?
a: 朋友给了不太接近的cron表达式:

  • 从每月3日2点1分0秒开始。每隔7天执行一次

2022/04/03 02:01:00开始
2022/04/10 02:01:00
2022/04/17 02:01:00
2022/04/24 02:01:00
2022/05/03 02:01:00下一个月又开始
...
  • 朋友说cron做不到,咱水平也就这样了,就只能选简单的每周0点执行一次吧:
`0 0 0 ? * MON`: 
2022-04-18 00:00:00
2022-04-25 00:00:00
2022-05-02 00:00:00
2022-05-09 00:00:00
...

设置监控

  • 我认为这是运维的基操,腾讯云的控制台也有设置按钮,权重也挺高。奈何自己没经验,没当一回事,吃亏了

排查过程

  • 问客服让重启之后登录进去服务器了,相继检查了nginx日志,pm2日志,express日志,都没发现DOSS攻击的痕迹
  • 这里有必要提一下TCP量为何增加,而且为何在内网链接:更新浏览量就是一直连接我本地mongodb数据库的过程,所以可以推断mongodb连接协议和http一致,是用TCP可靠传输的

完。

日期:2022-04-15 11:56 | 阅读:216 | 评论:0