本文目录一览:
基于gocron实现的定时任务服务降级方案
目前APP业务中启用的定时任务已达到400+,目前管理比较混乱,很多任务运行时占用服务器资源巨大,其中不乏一些非紧急的任务,平时并不会有太大影响,但是当流量高峰来临时,这些定时任务可能会成为压死骆驼的最后一根稻草。为了避免出现这样的问题,我们通常会在高流量来之前去调整一些定时任务的执行间隔时间或者暂停一些不影响服务的定时任务。这样做的弊端是工作量很大,同时难免会有遗漏。由此衍生除了对任务分级的诉求。对任务分级后,高峰流量时,可视情况降级相关等级的定时任务。
PS:设计核心流程的任务等,如支付回调
PS:任务中设计到事务等
基于gocron的任务节点做任务分级,不同级别的任务对应不同的gocron节点。如下图:
把三级任务放在三级节点上跑,如下图:
以此类推,不同级别的任务跑在对应级别的节点上。
当流量高峰来临时,我们想通过停掉所有三级任务来实现快速降级,而这个操作仅仅需要关闭对应节点的连接即可。如下图
PS:这个操作同时会停止所有正在运行的任务
举个例子:目前我的三级任务节点上运行了一个同步数据的任务(预计5分钟左右能执行完),当我把三级任务节点关闭时,这个任务会直接失败,在节点对应的机器上我们可以看到所有进程也被直接kill掉了,即使我的任务是多进程在跑,相应的子进程也会被kill掉。如下:
当前正在服务的三级节点-asgard三级定时任务
当前正在节点-asgard三级定时任务上运行的任务-商品数据整合同步搜索个推库
节点服务器上正在运行的进程
这时候我们关闭asgard三级定时任务这个节点
可以看到任务直接执行失败了
同时,节点服务器上的进程也被kill掉了
由于二级任务可能涉及到事务等操作,非万分紧急情况下不能直接终止,以免导致脏数据的产生。对于这种任务的降级我们不能直接通过节点的方式停止任务。可以通过关闭任务的方式停止。如下:
PS:关闭任务的操作会等当前的任务执行完成再关闭,不会对当前任务产生任何影响
举个例子:
还拿asgard三级定时任务这个节点来看,目前这个节点在链接状态
这个节点下跑了一个任务
同样的,节点服务器上有对应的进程在跑着
这时候,我们关闭这个任务
我们可以看到,关闭这个任务,不会影响正在执行的任务
节点对应的服务器上的任务也正常在跑
PS:这个关闭任务对应的是,完成当前任务后不再执行新的任务。
1、基于gocron的任务节点对任务做分级处理
2、一、二、三级任务的划分
3、服务降级的两种方式:关闭节点关闭任务
go中使用cmd与cron
/bin/bash -c "ls -l"
cmd-golang-pipe
pipe()创建2个文件描述符,fd[0]可读,fd[1]可写
fork() 创建子进程 fd[1]被继承到子进程
dup2() 重定向子进程 stdout/stderr到fd[1]
exec() 在当前进程内,加载并执行二进制程序
模拟一下cmd调用
模拟调用cmd时,杀死bash进程
go开源Cronexpr库
Parse() 解析与校验Cron表达式
Next() 根据当前时间,计算下一次调度时间
模拟一下cron调用
执行结果
模拟多个cron调用
执行结果
gin结合cron,实现定时任务
cron需要进行初始化,在gin的main中进行,然后后面的定时任务,使用addjob,addjob会返回一个jobid,后面关闭时,可以使用这个id去关闭。
1.main.go中初始化cron
2.InitCron,返回一个Cron类型
3.使用cj进行添加任务,任务会返回一个id,因为调用的时候会使用协程,将id通过channel返回
4.将id回收,已被删除定时任务时使用。另外实现mqttJob需要实现Run接口,addjob才能运行
5.删除定时任务,cj为gin初始化的new cron