专栏名称: 分布式实验室
最专业的Docker文章,最权威的Docker新闻。关注容器生态圈的发展。
目录
相关文章推荐
java1234  ·  Spring6.0+Boot3.0:秒级启动 ... ·  昨天  
java1234  ·  Spring6.0+Boot3.0:秒级启动 ... ·  昨天  
51好读  ›  专栏  ›  分布式实验室

分布式定时任务调度框架实践

分布式实验室  · 公众号  · 后端  · 2022-04-12 09:30

正文

请到「今天看啥」查看全文



2、Spring Task缺陷

Spring Task本身不支持持久化,也没有推出官方的分布式集群模式,只能靠开发者在业务应用中自己手动扩展实现,无法满足可视化,易配置的需求。

永远经典的Quartz

1、基本介绍

Quartz框架是Java领域最著名的开源任务调度工具,也是目前事实上的定时任务标准,几乎全部的开源定时任务框架都是基于Quartz核心调度构建而成。

2、原理解析

核心组件和架构:


关键概念:

  • Scheduler:任务调度器,是执行任务调度的控制器。本质上是一个计划调度容器,注册了全部Trigger和对应的JobDetail, 使用线程池作为任务运行的基础组件,提高任务执行效率。

  • Trigger:触发器,用于定义任务调度的时间规则,告诉任务调度器什么时候触发任务,其中CronTrigger是基于cron表达式构建的功能强大的触发器。

  • Calendar:日历特定时间点的集合。一个trigger可以包含多个Calendar,可用于排除或包含某些时间点。

  • JobDetail:是一个可执行的工作,用来描述Job实现类及其它相关的静态信息,如Job的名称、监听器等相关信息。

  • Job:任务执行接口,只有一个execute方法,用于执行真正的业务逻辑。

  • JobStore:任务存储方式,主要有RAMJobStore和JDBCJobStore,RAMJobStore是存储在JVM的内存中,有丢失和数量受限的风险,JDBCJobStore是将任务信息持久化到数据库中,支持集群。

3、实践说明

关于Quartz的基本使用:

  • 可参考Quartz官方文档和网上博客实践教程。

业务使用要满足动态修改和重启不丢失, 一般需要使用数据库进行保存。

  • Quartz本身支持JDBCJobStore,但是其配置的数据表比较多,官方推荐配置可参照官方文档,超过10张表,业务使用比较重。

  • 在使用的时候只需要存在基本trigger配置和对应任务以及相关执行日志的表即可满足绝大部分需求。

组件化:

  • 将quartz动态任务配置信息持久化到数据库,将数据操作包装成基本jar包,供项目之间使用,引用项目只需要引入jar包依赖和配置对应的数据表,使用时就可以对Quartz配置透明。

扩展:

  • 集群模式,通过故障转移和负载均衡实现了任务的高可用性,通过数据库的锁机制来确保任务执行的唯一性,但是集群特性仅仅只是用来HA,节点数量的增加并不会提升单个任务的执行效率,不能实现水平扩展。

  • Quartz插件,可以对特定需要进行扩展,比如增加触发器和任务执行日志,任务依赖串行处理场景,可参考:https://www.cnblogs.com/surprizeFuture/articles/quartzPlugin.html

4、缺陷和不足

  • 需要把任务信息持久化到业务数据表,和业务有耦合。

  • 调度逻辑和执行逻辑并存于同一个项目中,在机器性能固定的情况下,业务和调度之间不可避免地会相互影响。

  • quartz集群模式下,是通过数据库独占锁来唯一获取任务,任务执行并没有实现完善的负载均衡机制。

轻量级神器XXL-JOB

1、基本介绍

XXL-JOB是一个轻量级分布式任务调度平台,主打特点是平台化,易部署,开发迅速、学习简单、轻量级、易扩展,代码仍在持续更新中。

“调度中心”是任务调度控制台,平台自身并不承担业务逻辑,只是负责任务的统一管理和调度执行,并且提供任务管理平台,“执行器” 负责接收“调度中心”的调度并执行,可直接部署执行器,也可以将执行器集成到现有业务项目中。通过将任务的调度控制和任务的执行解耦,业务使用只需要关注业务逻辑的开发。

主要提供了任务的动态配置管理、任务监控和统计报表以及调度日志几大功能模块,支持多种运行模式和路由策略,可基于对应执行器机器集群数量进行简单分片数据处理。

2、原理解析

2.1.0版本前核心调度模块都是基于quartz框架,2.1.0版本开始自研调度组件,移除quartz依赖 ,使用时间轮调度。


3、实践说明

详细配置和介绍参考:https://www.xuxueli.com/xxl-job/#/?id=《分布式任务调度平台xxl-job》

demo使用:

示例1:实现简单任务配置,只需要继承IJobHandler 抽象类,并声明注解@JobHandler(value="offlineTaskJobHandler") ,实现业务逻辑即可。(注:此次引入了Dubbo,后文介绍)。

@JobHandler(value="offlineTaskJobHandler")
@Component
public class OfflineTaskJobHandler extends IJobHandler {
  
   @Reference(check = false,version = "cms-dev",group="cms-service")
   private OfflineTaskExecutorFacade offlineTaskExecutorFacade;
  
   @Override
   public ReturnT execute(String param) throws Exception {
      XxlJobLogger.log(" offlineTaskJobHandler start.");
  
      try {
         offlineTaskExecutorFacade.executeOfflineTask();
      } catch (Exception e) {
         XxlJobLogger.log("offlineTaskJobHandler-->exception." , e);
         return FAIL;
      }
  
      XxlJobLogger.log("XXL-JOB, offlineTaskJobHandler end.");
      return SUCCESS;







请到「今天看啥」查看全文