基于gocron实现的定时任务服务降级方案

基于gocron实现的定时任务服务降级方案,第1张

    目前APP业务中启用的定时任务已达到400+,目前管理比较混乱,很多任务运行时占用服务器资源巨大,其中不乏一些非紧急的任务,平时并不会有太大影响,但是当流量高峰来临时,这些定时任务可能会成为压死骆驼的最后一根稻草。为了避免出现这样的问题,我们通常会在高流量来之前去调整一些定时任务的执行间隔时间或者暂停一些不影响服务的定时任务。这样做的弊端是工作量很大,同时难免会有遗漏。由此衍生除了对任务分级的诉求。对任务分级后,高峰流量时,可视情况降级相关等级的定时任务。

        PS:设计核心流程的任务等,如支付回调

        PS:任务中设计到事务等

    基于gocron的任务节点做任务分级,不同级别的任务对应不同的gocron节点。如下图:
    把三级任务放在三级节点上跑,如下图:
    以此类推,不同级别的任务跑在对应级别的节点上。

    当流量高峰来临时,我们想通过停掉所有三级任务来实现快速降级,而这个 *** 作仅仅需要关闭对应节点的连接即可。如下图

PS:这个 *** 作同时会停止所有正在运行的任务

举个例子:目前我的三级任务节点上运行了一个同步数据的任务(预计5分钟左右能执行完),当我把三级任务节点关闭时,这个任务会直接失败,在节点对应的机器上我们可以看到所有进程也被直接kill掉了,即使我的任务是多进程在跑,相应的子进程也会被kill掉。如下:

当前正在服务的三级节点-asgard三级定时任务
当前正在节点-asgard三级定时任务上运行的任务-商品数据整合同步搜索个推库
节点服务器上正在运行的进程

这时候我们关闭asgard三级定时任务这个节点
可以看到任务直接执行失败了
同时,节点服务器上的进程也被kill掉了
    由于二级任务可能涉及到事务等 *** 作,非万分紧急情况下不能直接终止,以免导致脏数据的产生。对于这种任务的降级我们不能直接通过节点的方式停止任务。可以通过关闭任务的方式停止。如下:
PS:关闭任务的 *** 作会等当前的任务执行完成再关闭,不会对当前任务产生任何影响

举个例子:

还拿asgard三级定时任务这个节点来看,目前这个节点在链接状态
这个节点下跑了一个任务
同样的,节点服务器上有对应的进程在跑着
这时候,我们关闭这个任务
我们可以看到,关闭这个任务,不会影响正在执行的任务
节点对应的服务器上的任务也正常在跑
PS:这个关闭任务对应的是,完成当前任务后不再执行新的任务。

    1、基于gocron的任务节点对任务做分级处理

    2、一、二、三级任务的划分

    3、服务降级的两种方式:关闭节点&关闭任务

crond是什么?

crond 和crontab是不可分割的。crontab是一个命令,常见于Unix和类Unix的 *** 作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语chronos(χρόνος),原意是时间。

而crond正是它的守护进程。cron服务是一个定时执行的服务,可以通过crontab 命令添加或者编辑需要定时执行的任务。

linux定时任务分为两种

1)系统自身轮训的任务,比如定时(5天或者一周)备份/var/log/message等日志文件(系统的定时任务一般分为七段或者八段(centos6以下),以空格分割)

系统轮训的配置文件/etc/logrotateconf (centos7以下的在/etc/crondaily/logrotate/logrotateconf )

2)用户执行的定时任务(用户的定时任务一般分为六段)

at适合执行一次就结束的调度任务

anacrontab适合于非724小时开机的服务器准备的,是以天为单位执行的,不能指定以分钟的定时任务,在停机期间没有任务执行,可以开机时执行。

cron服务是Linux的内置服务,但它不会开机自动启动,可以每分钟执行任务。可以用以下命令启动和停止服务:

以上1-5行分别为启动、停止、重启服务和重新加载配置、查看服务状态

把cron设为在开机的时候自动启动

crontab *** 作

基本格式

基本使用

JMulTi 是一个用于计量经济学和时间序列分析的开源软件包。以下是安装和配置 JMulTi 的步骤:
1 下载 JMulTi 软件包。可以从 JMulTi 官方网站(>

前面我们介绍了 Kettle的Spoon的转换和作业定时任务GUI设计方式以及运行,但是在实际应用中,我们需要计划任务是在服务器后台运行。

首先我们需要了解Kettle的Kitchen和Pan
Kitchen——作业(job)执行器 (命令行方式)
Pan——转换(trasform)执行器 (命令行方式)

下面我们将重点讲解经常会用到的 作业执行器 Kitchenbat 。

1、新建一个bat文件,命名jobbat,然后编辑,输入内容如下:

注意:确保路径的正确性。

2、双击jobbat,即可运行。

我们已经建立了命令行运行的bat文件,并且已经可以正确执行我们的ETL任务了,但是现在我们在运行bat后,桌面上面会一直存在一个控制台的黑窗口,我们可以使用bat命令中的隐藏窗口的命令。

修改我们的jobbat文件

在此双击jobbat运行,我们将不会再看到控制台黑窗口继续保留在桌面上,并且等待设置的间隔时间后,我们可以看到日志文件记录。
···
2017/12/07 16:51:26 - Kitchen - Logging is at level : 基本日志
2017/12/07 16:51:26 - Kitchen - Start of run
2017/12/07 16:51:31 - job2 - 开始执行任务
2017/12/07 16:51:31 - job2 - job2
2017/12/07 16:53:31 - job2 - 开始项[简单表同步]
2017/12/07 16:53:31 - 简单表同步 - Loading transformation from XML file [file:///D:/KettleProject/TEST2ktr]
2017/12/07 16:53:31 - 简单表同步 - Using run configuration [Pentaho local]
2017/12/07 16:53:31 - 简单表同步 - Using legacy execution engine
2017/12/07 16:53:31 - TEST2 - 为了转换解除补丁开始 [TEST2]
2017/12/07 16:53:32 - 表输入0 - Finished reading query, closing connection
2017/12/07 16:53:32 - 表输入0 - 完成处理 (I=3, O=0, R=0, W=3, U=0, E=0)
2017/12/07 16:53:32 - 插入 / 更新0 - 完成处理 (I=3, O=0, R=3, W=3, U=1, E=0)
···

上一篇: Kettle入门之三 Kettle定时任务(GUI)
下一篇: Kettle入门之五 Kettle应用场景(增量插入和更新)

这个是我在网上找的不知道是不是你要的:
java定时任务Timer 关于定时任务,似乎跟时间 *** 作的联系并不是很大,但是前面既然提到了定时任务,索性在这里一起解决了。设置定时任务很简单,用Timer类就搞定了。一、延时执行首先,我们定义一个类,给它取个名字叫TimeTask,我们的定时任务,就在这个类的main函数里执行。代码如下:
package test;
import javautilTimer;
public class TimeTaskTest {
public static void main(String[] args){ Timer timer = new Timer();
timerschedule(new Task(), 60 1000);
}
}
解释一下上面的代码。上面的代码实现了这样一个功能,当TimeTask程序启动以后,过一分钟后执行某项任务。很简单吧:先new一个Timer对象,然后调用它的schedule方法,这个方法有四个重载的方法,这里我们用其中一个,
public void schedule(TimerTask task,long delay)
首先,第一个参数第一个参数就是我们要执行的任务。这是一个TimerTask对象,确切点说是一个实现TimerTask的类的对象,因为TimerTask是个抽象类。上面的代码里 面,Task就是我们自己定义的实现了TimerTask的类,因为是在同一个包里面,所以没有显性的import进来。Task类的代码如下
package test;
import javautilTimerTask;
public class Task extends TimerTask { public void run()
{
Systemoutprintln("定时任务执行");
}
}
我们的Task必须实现TimerTask的方法run,要执行的任务就在这个run方法里面,这里,我们只让它往控制台打一行字。第二个参数第二个参数是一个long型的值。这是延迟的时间,就是从程序开始以后,再过多少时间来执行定时任务。这个long型的值是毫秒数,所以前面我们的程序里面,过一分钟后执行用的参数值就是 60 1000。二、循环执行设置定时任务的时候,往往我们需要重复的执行这样任务,每隔一段时间执行一次,而上面的方法是只执行一次的,这样就用到了schedule方法的是另一个重载函数public void schedule(TimerTask task,long delay,long period)
前两个参数就不用说什么了,最后一个参数就是间隔的时间,又是个long型的毫秒数(看来java里涉及到时间的,跟这个long是脱不了干系了),比如我们希望上面的任务从第一次执行后,每个一分钟执行一次,第三个参数值赋60 1000就ok了。三、指定执行时间既然号称是定时任务,我们肯定希望由我们来指定任务指定的时间,显然上面的方法就不中用了,因为我们不知道程序什么时间开始运行,就没办法确定需要延时多少。没关系,schedule四个重载的方法还没用完呢。用下面这个就OK了:
public void schedule(TimerTask task,Date time)
比如,我们希望定时任务2006年7月2日0时0分执行,只要给第二个参数传一个时间设置为2006年7月2日0时0分的Date对象就可以了。有一种情况是,可能我们的程序启动的时候,已经是2006年7月3日了,这样的话,程序一启动,定时任务就开始执行了。schedule最后一个重载的方法是public void schedule(TimerTask task,Date firstTime,long period)
没必要说什么了吧:)四、j2ee中的定时任务在实际的项目中,往往定时任务需要对web工程中的资源进行 *** 作,这样一来,用上面的单个程序的方式可能就有点力不从心了,因为很多web工程的资源它 *** 作不到。解决的办法是,使用Servlet,把执行定时任务的那些代码放到Servlet的init()函数里就可以了,这个easy,就没有必要再写示例代码了吧

window环境可以考虑用 任务计划调用bat批处理文件进行发送。
>Elastic-Job当当网基于quartz 二次开发的d性分布式任务调度系统,功能丰富强大,采用zookeeper实现分 布式协调,实现任务高可用以及分片。它由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成,使用Elastic-Job可以快速实现分布式任务调度。 
提供的功能:

分布式调度协调: 在分布式环境中,任务能够按指定的调度策略执行,并且能够避免同一任务多实例重复执行。 

丰富的调度策略: 基于成熟的定时任务作业框架Quartz cron表达式执行定时任务。 

d性扩容缩容: 当集群中增加某一个实例,它应当也能够被选举并执行任务;当集群减少一个实例时,它所执行的任务能被转移到别的实例来执行。 

失效转移: 某实例在任务执行失败后,会被转移到其他实例执行。 

错过执行作业重触发 : 若因某种原因导致作业错过执行,自动记录错过执行的作业,并在上次作业完成后自动触发。 

支持并行调度 : 支持任务分片,任务分片是指将一个任务分为多个小任务项在多个实例同时执行。 

作业分片一致性 : 当任务被分片后,保证同一分片在分布式环境中仅一个执行实例。 

支持作业生命周期 *** 作 : 可以动态对任务进行开启及停止 *** 作。 

丰富的作业类型: 支持Simple、DataFlow、Script三种作业类型,后续会有详细介绍。 

Spring整合以及命名空间支持 : 对Spring支持良好的整合方式,支持spring自定义命名空间,支持占位符。 

运维平台 : 提供运维界面,可以管理作业和注册中心。 

分片概念 

作业分片是指任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的应用实例分别执行某 一个或几个分片项。 

例如:Elastic-Job快速入门中文件备份的例子,现有2台服务器,每台服务器分别跑一个应用实例。为了快速的执行作业,那么可以将作业分成4片,每个应用实例个执行2片。作业遍历数据的逻辑应为:实例1查找text和image 类型文件执行备份;实例2查找radio和video类型文件执行备份。 如果由于服务器扩容应用实例数量增加为4,则 作业遍历数据的逻辑应为:4个实例分别处理text、image、radio、video类型的文件。 

可以看到,通过对任务合理的分片化,从而达到任务并行处理的效果,最大限度的提高执行作业的吞吐量。 

分片项与业务处理解耦 

Elastic-Job并不直接提供数据处理的功能,框架只会将分片项分配至各个运行中的作业服务器,开发者需要自行处 理分片项与真实数据的对应关系。 

最大限度利用资源

将分片项设置为大于服务器的数量,最好是大于服务器倍数的数量,作业将会合理的利用分布式资源,动态的分配分片项。 

例如:3台服务器,分成10片,则分片项分配结果为服务器A=0,1,2;服务器B=3,4,5;服务器C=6,7,8,9。 如果服务器C 崩溃,则分片项分配结果为服务器A=0,1,2,3,4;服务器B=5,6,7,8,9。在不丢失分片项的情况下,最大限度的利用现有资源提高吞吐量。 

作业类型

elastic-job提供了三种类型的作业:Simple类型作业、Dataflow类型作业、Script类型作业。这里主要讲解前两者。Script类型作业意为脚本类型作业,支持shell,python,perl等所有类型脚本,使用不多,可以参见github文档。 

SimpleJob需要实现SimpleJob接口,意为简单实现,未经过任何封装,与quartz原生接口相似。

Dataflflow类型的定时任务需实现DataflflowJob接口,该接口提供2个方法可供覆盖,分别用于抓取(fetchData)和处理(processData)数据。Dataflflow类型用于处理数据流,它和SimpleJob不同,它以数据流的方式执行,调用fetchData抓取数据,直到抓取不到数据才停止作业。 

非流式处理数据则只会在每次作业执行过程中执行一次fetchData方法和processData方法,随即完成本次作业。  


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13276435.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-06
下一篇 2023-07-06

发表评论

登录后才能评论

评论列表(0条)

保存