在日常开发中除了给前端开发接口,还要写一些定时处理任务,比如一个活动需要每天定时给所有用户派发奖励。一个成熟服务框架需要一个全局的定时任务调度中心,通过定时任务调度中心可以查看服务有哪些定时任务以及定时任务的执行情况,对于执行失败的定时任务可以手动执行等。

我们公司的微服务架构没有定时任务调度中心,每个服务通过类似crontab定时任务配置来管理自身的定时任务,为了保证每个服务高可用,我们给每个服务都部署了两个节点,对于一些不能并发执行的定时任务我们往往需要给定时任务加一个分布式锁,有时甚至需要修改服务的crontab定时任务配置,保证一组服务只一个服务能执行定时任务,对于定时任务执行情况没有一个统一地方可以查看,需要查看每个服务日志才能确认定时任务是否执行成功,对于执行失败的定时任务需要写额外的重做代码。所以我们需要一个定时任务调度中心来管理每个服务的定时任务,这个定时任务调度中心需要有以下功能:

  1. 可以查看服务有哪些定时任务以及任务的执行状态。
  2. 对于执行失败的定时任务可以在管理界面手动发起重做。
  3. 每个定时任务都抽象成接口,由定时任务调度中心负责调度。
  4. 定时任务什么时候执行应由具体业务服务配置,定时任务调度中心可获取这些配置进行定时调度。

既然决定开发一个定时任务调度中心,那么问题来了,我们是否需要开发一个新的服务?我的答案是不需要,我们把定时任务当作服务接口,我们所有服务的接口信息都登记到服务注册中心,我们可以给接口添加一个定时任务标签,注册中心将打上定时任务标签的服务接口放到一个定时任务执行队列中,由定时任务执行队列管理每个服务定时任务接口的调度,同时将各个服务的定时任务接口与执行情况记录到数据库中,然后在注册中心添加一个定时任务管理页面来管理各个服务的定时任务。

定时任务调度中心的大致思路有了,剩下的过程就是将实现思路具体化。我们现有的定时任务配置与crontab类似,可以按分钟、小时、日期、月份、星期等几个维度进行配置,如果定时任务调度中心全部实现这几个维度的配置,会导致定时任务配置解析与调度逻辑变得复杂,一个框架因为简单才更加稳定可靠,我决定对定时任务配置维度进行简化处理,最终抽象出以下两类定时任务:

  1. 每隔N秒执行一次的定时任务。
  2. 每天特定时间点执行的定时任务。

每个定时任务都可能执行多次,即每个定时任务可以有多条执行记录,所以可以在定时任务管理页面中查看每个定时任务的执行情况,但日常运维中我们不是很关心定时任务的历史执行情况,如果记录定时任务每次的执行情况,我们还要考虑如何管理历史执行记录以及历史执行记录太多了该如何处理,我不希望因为开发定时任务调度中心导致服务注册中心过于臃肿(定时任务调度中心当作服务注册中心的一个子模块来开发),所以我决定我们的定时任务调度中心只记录每个定时任务最近一次的执行记录。

对于日常运营活动中的定时任务,在活动结束时这些定时任务的生命周期也结束,这就要求业务服务的定时任务可以自动卸载,我们约定当定时任务生命周期结束时业务服务的定时任务接口应该返回UNINSTALL错误码,任务调度中心调用定时任务接口时如果接口返回UNINSTALL错误码则将定时任务从任务调用队列中移除。

根据以上的思路,我们开发了一个足够简单稳定的定时任务调度中心。首先我们针对两种类型的定时任务添加以下两个注解,接口类的注解信息最终会上报的服务注册中心。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public static @interface TimerTask{int value();    //每隔N秒执行一次(值为整形)
}@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public static @interface DailyTask{String value(); //每天特点时间点执行(如:09:00:00)
}

我们希望添加一个名为SendPrize的定时任务,这个任务每天09:00:00执行一次,则我们只用给这个类添加DailyTask注解就可以了,相关代码如下:

@DailyTask("09:00:00")
@WebAppPath("${classname}")
public class SendPrize extends WebApp{public void process(HttpRequest request, HttpResponse response) throws Exception{response.setBody("hello world");}
}
定时任务调度中心的管理界面如下:

一个简单的定时任务调度中心设计方案相关推荐

  1. 分布式定时任务调度中心

    分布式定时任务调度中心选型 目前主流的开源分布式定时任务调度中心据我了解主要是XXL-JOB和ELASTIC-JOB. 对比: 以上框架实现的功能大体都差不多,下面说下我选择XXL-JOB的原因: 1 ...

  2. 一个简单的RPG游戏架构设计方案

    一个简单的RPG游戏架构设计方案 下面是一个简单的RPG游戏架构设计方案,实现了RPG游戏的基本功能(故事情节.战斗). 整个系统以RPGGameEngine模块为核心,周边包括了故事情节(Scrip ...

  3. tim工具包-task 定时任务调度中心 分布式可配置v1.5.0版本

    相关文章: tim工具包-dao层查询工具 tim工具包-sql管理平台-admin tim工具包-自动生成api接口 tim工具包-MyMath牛逼的计算工具 tim工具包-数据处理工具 v1.2 ...

  4. tim工具包-task 定时任务调度中心 分布式可配置v1.3.0版本

    相关文章: tim工具包-dao层查询工具 tim工具包-sql管理平台-admin tim工具包-自动生成api接口 tim工具包-MyMath牛逼的计算工具 tim工具包-数据处理工具 v1.2 ...

  5. 任务调度框架Quartz(一) Quartz——一个强大的定时任务调度框架

    Quartz,水晶.石英,一个简单朴素有美丽的名字,在Java程序界,Quartz大名鼎鼎,很多Java应用几乎都集成或构建了一个定时任务调度系统,Quartz是一个定时任务调度框架. 何为定时任务调 ...

  6. (转)微服务_创建一个简单的Eureka注册中心

    原文地址:https://www.cnblogs.com/lplshermie/p/9105329.html 微服务和分布式已经成了一种极其普遍的技术,为了跟上时代的步伐,最近开始着手学习Spring ...

  7. java 提醒小工具_【JAVA】一个简单的定时提醒小程序

    [Java] 纯文本查看 复制代码import javax.swing.JOptionPane; public class Test { public static void main(String[ ...

  8. python中的轻量级定时任务调度库:schedule

    提到定时任务调度的时候,相信很多人会想到celery,要么就写个脚本塞到crontab中.不过,一个小的定时脚本,要用celery的话太"重"了.所以,我找到了一个轻量级的定时任务 ...

  9. windows 服务实现定时任务调度(Quartz.Net)

    我们通常在一些情况下需要软件具有一个自动执行某些任务的功能,但是又不希望直接启动软件,或者每次都要手动的来启动软件,这时我们可可以考虑到windows服务了. 首先创建一个windows服务项目(详细 ...

最新文章

  1. OpenCV 图像处理系列(6)—— 图像的几何变化
  2. UITableView 滑动删除
  3. SpringBoot24 SpringDataJPA环境搭建、实体类注解、关联查询
  4. 前滴滴产品总监刘滢:从这里了解新零售的本质
  5. boost::container模块实现vector选项
  6. 一次详细全面的***报告
  7. 撩妹学会这一招,就没有人能拒绝你!
  8. datagrid获取页面总记录数的方法,datagrid获取页面总记录数为0的解决方法
  9. 比较两个数组,输出不重复的数组
  10. 华为鸿蒙开机不用广告,华为鸿蒙系统开机无广告:用户好评,友商品牌批评。只因树大招风...
  11. 记某次CTF中Let me in
  12. xuperchain 区块最大大小 区块容量 maxblocksize
  13. 例题:最高响应比优先调度算法
  14. GNU C Complier - GNU Compiler Collection - GCC
  15. 数据库系统原理mysql答案_数据库原理与应用MySQL答案
  16. PHP之——官方手册下载地址
  17. Vue中qrcode的使用方法(生成二维码插件) / 前端页面根据URL链接生成二维码
  18. 华为OD机试 - 完美走位(Java JS Python)
  19. java md5库_Java常用类库API之MD5简单使用
  20. 物理:窄脉冲 | 九七的物理

热门文章

  1. Node.js学习6~nodejs报Error: Cannot find module ‘express‘
  2. 阿里云不同账号实现内网ping通
  3. arm开发板移植ALSA库与ALSA工具
  4. 【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用
  5. 基于javaweb的房屋租赁管理系统(java+ssm+layui+mysql+jsp)
  6. Linux运维工程师前景
  7. 百度飞桨七天训练营结营总结
  8. java让线程空转_详解Java编程中对线程的中断处理
  9. Go语言Seelog入门
  10. 韦东山 android 淘宝,韦东山-android音频子系统中audio_policy.conf的usb声卡理解 - 百问网嵌入式问答社区...