一、背景
目前APP业务中启用的定时任务已达到400+,目前管理比较混乱,很多任务运行时占用服务器资源巨大,其中不乏一些非紧急的任务,平时并不会有太大影响,但是当流量高峰来临时,这些定时任务可能会成为压死骆驼的最后一根稻草。为了避免出现这样的问题,我们通常会在高流量来之前去调整一些定时任务的执行间隔时间或者暂停一些不影响服务的定时任务。这样做的弊端是工作量很大,同时难免会有遗漏。由此衍生除了对任务分级的诉求。对任务分级后,高峰流量时,可视情况降级相关等级的定时任务。
二、任务分级说明
1、一级任务:不管说明情况下都不能停的任务
PS:设计核心流程的任务等,如支付回调
2、二级任务:不能中途强制停止的任务,需要等任务完成才能停止任务
PS:任务中设计到事务等
3、三级任务:随时可以停止,不会对系统和服务造成异常的任务
三、实现方案
1、节点分级
基于gocron的任务节点做任务分级,不同级别的任务对应不同的gocron节点。如下图:
![](https://img.haomeiwen.com/i11351372/6a99d21549395001.png)
2、任务分级
把三级任务放在三级节点上跑,如下图:
![](https://img.haomeiwen.com/i11351372/871a22c79a87bae1.png)
以此类推,不同级别的任务跑在对应级别的节点上。
3、服务降级
3.1、直接终止所有三级任务。
当流量高峰来临时,我们想通过停掉所有三级任务来实现快速降级,而这个操作仅仅需要关闭对应节点的连接即可。如下图
![](https://img.haomeiwen.com/i11351372/640023c8fba94f5e.png)
PS:这个操作同时会停止所有正在运行的任务
举个例子:目前我的三级任务节点上运行了一个同步数据的任务(预计5分钟左右能执行完),当我把三级任务节点关闭时,这个任务会直接失败,在节点对应的机器上我们可以看到所有进程也被直接kill掉了,即使我的任务是多进程在跑,相应的子进程也会被kill掉。如下:
当前正在服务的三级节点-asgard三级定时任务
![](https://img.haomeiwen.com/i11351372/f1642f39f607cd6b.png)
当前正在节点-asgard三级定时任务上运行的任务-商品数据整合同步搜索个推库
![](https://img.haomeiwen.com/i11351372/9c1c1634b762ffc2.png)
![](https://img.haomeiwen.com/i11351372/e428688aefcfff9f.png)
节点服务器上正在运行的进程
![](https://img.haomeiwen.com/i11351372/cf5198c55036bff3.png)
这时候我们关闭asgard三级定时任务这个节点
![](https://img.haomeiwen.com/i11351372/a5fc218b9f630a9d.png)
可以看到任务直接执行失败了
![](https://img.haomeiwen.com/i11351372/f068fe3defbc44d1.png)
![](https://img.haomeiwen.com/i11351372/a7e04784a91888b2.png)
同时,节点服务器上的进程也被kill掉了
![](https://img.haomeiwen.com/i11351372/2f5d144eb17f8197.png)
3.2、停止二级任务
由于二级任务可能涉及到事务等操作,非万分紧急情况下不能直接终止,以免导致脏数据的产生。对于这种任务的降级我们不能直接通过节点的方式停止任务。可以通过关闭任务的方式停止。如下:
![](https://img.haomeiwen.com/i11351372/1e3559ad4a5684aa.png)
PS:关闭任务的操作会等当前的任务执行完成再关闭,不会对当前任务产生任何影响
举个例子:
还拿asgard三级定时任务这个节点来看,目前这个节点在链接状态
![](https://img.haomeiwen.com/i11351372/d67ab869353adcad.png)
这个节点下跑了一个任务
![](https://img.haomeiwen.com/i11351372/bbd0d0f22982b73c.png)
![](https://img.haomeiwen.com/i11351372/ffaa3239d28d6b2f.png)
同样的,节点服务器上有对应的进程在跑着
![](https://img.haomeiwen.com/i11351372/268eba4dc42970ae.png)
这时候,我们关闭这个任务
![](https://img.haomeiwen.com/i11351372/f905f2dc5da38a4c.png)
我们可以看到,关闭这个任务,不会影响正在执行的任务
![](https://img.haomeiwen.com/i11351372/ff90b2a10421424f.png)
节点对应的服务器上的任务也正常在跑
![](https://img.haomeiwen.com/i11351372/c4e01d275fc661b8.png)
PS:这个关闭任务对应的是,完成当前任务后不再执行新的任务。
四、总结
1、基于gocron的任务节点对任务做分级处理
2、一、二、三级任务的划分
3、服务降级的两种方式:关闭节点&关闭任务
网友评论