XXL-JOB简介

首先我们得知道XXL-JOB是什么,他是一个分布式调度平台。

背景

首先介绍一下定时任务的概念,定时任务主要是包括某个时间点去执行某个具体的任务。在Java中实现定时任务的方式主要有几种:

  1. while(true)+Thread.sleep: 通过轮询+线程休眠的方式实现定时任务
  2. java.util.Timer+java.util.TimerTask: Timer是jdk提供的一个定时器工具,它可以计划执行一个任务或反复执行一个任务;TimerTask是jdk的一个抽象类,它的子类代表一个可以被Timer计划执行的任务
  3. ScheduleExecutorService: ScheduleExecutorService从jdk1.5开始引入作为并发工具类,是理想的定时任务实现方式
  4. Quartz: Quartz是一个开源的定时任务调度框架,由Java编写而成,用于Java生态下的定时任务调度,是个灵活方便、使用简单的定时任务调度框架,可以和Spring整合使用
  5. Spring Task: Spring框架提供的轻量级定时任务调度工具,使用方便
  6. Spring Boot注解 @EnableScheduling+@Scheduled: Spring Boot提供的定时任务调度工具,底层采用的依然是Spring Task

分布式任务调度介绍

什么是任务调度?

我们可以先思考一下下面业务场景的解决方案:

  • 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。
  • 某银行系统需要在信用卡到期还款日的前三天进行短信提醒。
  • 某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总。
  • 12306会根据车次的不同,而设置某几个时间点进行分批放票。
  • 某网站为了实现天气实时展示,每隔5分钟就去天气服务器获取最新的实时天气信息。

任务调度是指系统为了自动完成特定任务,在约定的特定时刻去执行任务的过程。有了任务调度即可解放更多的人力由系统自动去执行任务。

上面章节所介绍的六种定时任务实现方式主要都是集中式的定时任务。采用集中式的定时任务调度,会带来如下的一些问题:

  1. 多台机器集群部署的定时任务如何保证任务不被重复执行?
  2. 在不重启应用的情况下,如何动态地调整定时任务的执行时间?
  3. 部署任务的时候机器发生故障如何实现故障的转移?
  4. 如何对定时任务进行监控?
  5. 业务量比较大,遇到单机性能瓶颈,如何进行分片扩展?

正由于集中式任务调度存在以上一系列问题,所以在技术演进中产生一些具体的解决办法:

  1. 使用数据库的唯一约束来解决重复执行问题
  2. 使用配置文件,redis,mysql作为调度的开关
  3. 使用分布式锁实现任务的调度
  4. 使用分布式任务调度平台,如Elastric-Job、Saturn、TBSchedule、XXL-JOB、Google Cron等

而使用分布式任务调度平台是全面、系统解决集中式任务调度所存在问题的一个很好的方案。其中XXL-JOB在国内线上生产环境的使用案例比较多,它的核心设计目标是开发迅速、学习简单、轻量级、易扩展。XXL-JOB官方文档的地址是分布式任务调度平台XXL-JOB,总体设计架构如下图:

猜你喜欢

转载自blog.csdn.net/weixin_43918614/article/details/124421736