常见的分布式定时任务调度框架

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 分布式定时任务调度框架用于在分布式系统中管理和调度定时任务,确保任务按预定时间和频率执行。其核心概念包括Job(任务)、Trigger(触发器)、Executor(执行器)和Scheduler(调度器)。这类框架应具备任务管理、任务监控、良好的可扩展性和高可用性等功能。常用的Java生态中的分布式任务调度框架有Quartz Scheduler、ElasticJob和XXL-JOB。

概念与功能

分布式定时任务调度框架是一种专门用于在分布式系统中管理和调度定时任务的工具。这类框架能够在多个节点上协调执行任务,确保任务按照预定的时间和频率执行。从系统分析角度来讲,所有的分布式定时任务调度器都包含四个核心概念。

  1. Job: 作业,代表需要被调度和执行的任务
  2. Trigger: 触发器,定义Job的触发时机
  3. Executor: 执行器,执行任务的工作节点
  4. Scheduler: 调度器,根据Trigger信息,对Job进行调度分配

一个完善的分布式定时任务调度器应该具有如下的功能:

  1. 任务管理功能:
  1. 按照设置好的任务调度策略触发任务的分配与执行
  2. 允许用户添加新任务、编辑已有任务的配置信息,以及删除不再需要的任务
  3. 支持设置任务之间的依赖关系,确保任务按照指定的顺序执行
  4. 有且只有一个服务节点执行某个触发器上的作业
  1. 任务监控功能:
  1. 提供实时的任务执行状态监控
  2. 记录任务执行的开始时间,结束时间,执行结果和具体的执行器地址等
  1. 具有良好的可扩展性和可用性
  1. 每天可以调度数千、数万甚至上百万个任务的执行
  2. 不会因为系统中部分机器的故障导致任务调度失败

目前,在Java生态中,有很多成熟的分布式任务调度框架可供选择。接下来,我们来列举几个常用的分布式定时任务调度框架。

Quartz Scheduler

Quartz Scheduler是一款开源的分布式任务调度框架,其全称是Quartz Enterprise Job Scheduler。Quartz Scheduler依赖数据库存储来记录任务状态,进行任务的调度。

Quartz Scheduler框架具有如下几个核心概念:

  1. Job: Job代表一个需要被调度的具体任务。
  2. JobDetail: JobDetail是用来描述Job详细信息的类。每个JobDetail对象包含了Job的关键信息,包括Job的名称、Job组名、Job类、Job数据等。
  3. Trigger: Trigger是用于定义任务执行时间和执行规则的组件。每个Job都需要关联一个或多个Trigger,以指定任务何时执行。常用的Trigger类型有SimpleTrigger和CronTrigger等。
  4. JobStore: JobStore负责Job和Trigger的持久化存储。
  5. Scheduler: Scheduler是Quartz Scheduler的核心组件,负责管理和协调所有的任务调度工作。
  6. Listener: Quartz Scheduler提供了丰富的监听器接口,开发人员可以实现自定义的监听器来监控任务的执行状态、处理任务执行事件等。

Quartz Scheduler的主要工作流程如下图所示:

当使用Quartz Scheduler框架时,我们通常需要编写一些代码来配置调度器(scheduler)、定义任务逻辑(Job)和触发器(Trigger)以及启动调度器。相关代码示例如下所示。

// 创建调度器
 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
 // 创建Job实例
 JobDetail job = JobBuilder.newJob(SimpleJob.class)
        .withIdentity("simpleJob", "group1")
        .build();
// 创建Trigger,20秒后执行
Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity("simpleTrigger", "group1")
        .startAt(DateBuilder.futureDate(20, DateBuilder.IntervalUnit.SECOND))
        .build();
 // 启动调度器
 scheduler.start();
 // 将Job和Trigger关联到调度器,完成任务调度设置
 scheduler.scheduleJob( jobDetail, trigger );

Quartz Scheduler是比较古老的一款分布式任务调度框架,它简单易用,上手方便,适用于小型分布式系统。该框架也存在着一些缺点,例如:水平扩展性差(Quartz依赖数据库锁来保证有且只有一个执行器运行某项具体Job),缺少可视化管理等。

ElasticJob

ElasticJob最初是由当当网开源的分布式调度框架,该框架目前已经是Apache ShardingSphere开源项目下的子项目。ElasticJob底层处理逻辑依赖于Quartz,但是相对于Quartz,ElasticJob的核心竞争力主要包括:良好的可扩展性,任务分片和可视化管理。ElasticJob在发布之初只有一个elastic-job-core项目。从2.x版本开始,该项目被拆分成elastic-job-lite和elastic-job-cloud两个子项目。elastic-job-lite 为轻量级无中心化解决方案,使用 jar 包提供分布式任务的调度和治理。 elastic-job-cloud 采用中心化架构设计,通过Mesos对资源进行控制,并且通过部署在Mesos Master上面的调度器进行任务和资源的分配。

接下来,我们主要介绍一下elatic-job-lite框架的工作原理。本章节中的工作原理介绍基于elastic-job-lite 2.1.5版本进行。

在ElasticJob框架中,任务调度执行处理流程如下所示:

虽然ElasticJob在底层依然依赖Quartz Scheduler框架针对单个job做任务调度工作,但是在确保任务执行节点唯一性方面却有显著的优势。因为ElasticJob不再依赖分布式锁抢占来保证任务执行节点的唯一性,而是通过向zookeepr的job节点添加相关配置信息而提前为任务调度工作分配好执行器节点,同时利用了zookeeper的服务注册与发现功能实现了任务调度故障迁移功能。ElasticJob中的任务分片功能也极大地提高了任务执行的速度和效率。

XXL-JOB

XXL-JOB也是一款目前使用比较多的开源分布式任务调度系统,该系统的早期版本在任务调度方面也是依赖Quartz框架进行的。但是,从v2.1.0版本开始,该系统使用了自研调度组件替代了底层对Quartz框架的依赖(注意:这次的版本升级并不是向前兼容的。所以如果想要将生产环境正在使用的v1.x版本XXL-JOB系统升级到v2.1.x版本,那么在已有任务的无缝迁移上面可能面临一些比较头疼的问题,具体升级方案可以参考我之前发表的一篇文章:XXL-JOB最佳实践与升级指南)。与ElasticJob不同的是,XXL-JOB具有明确的任务调度服务器集群来进行任务调度。目前官方网站给出的v2.4.0版本架构图如下所示:

有关该系统的具体使用方法,本文内容不做过多的介绍。感兴趣的读者可以自行前往相关官方网站进行查看。这里我们只是介绍一下XXL-JOB自研任务调度组件的工作原理。

如上面的架构图所示,XXL-JOB主要由两个子系统组成,分别是调度中心侧子系统和执行器侧子系统。自研任务调度组件功能工作在调度中心侧子系统中。下载相关源代码之后,我们可以直接对相关功能进行静态分析和动态分析。分析之后,我们会发现任务调度的主要处理逻辑是在JobScheduleHelper类中完成的。主要处理流程如下所示:

总结

本文介绍了三种常用的轻量级分布式定时任务调度器以及它们的底层工作原理,更多相关知识请阅读书籍《Java网络爬虫精解与实践》。本文由原创作者首发在阿里云技术社区,未经许可,请勿转载。

相关文章
|
8天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
36 2
|
1月前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
54 6
|
1月前
|
数据库
如何在Seata框架中配置分布式事务的隔离级别?
总的来说,配置分布式事务的隔离级别是实现分布式事务管理的重要环节之一,需要认真对待和仔细调整,以满足业务的需求和性能要求。你还可以进一步深入研究和实践 Seata 框架的配置和使用,以更好地应对各种分布式事务场景的挑战。
32 6
|
29天前
|
消息中间件 运维 数据库
Seata框架和其他分布式事务框架有什么区别
Seata框架和其他分布式事务框架有什么区别
28 1
|
2月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
4月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
131 2
基于Redis的高可用分布式锁——RedLock
|
23天前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
66 5
|
26天前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
58 8
|
1月前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁通过SETNX指令实现,确保仅在键不存在时设置值。此机制用于控制多个线程对共享资源的访问,避免并发冲突。然而,实际应用中需解决死锁、锁超时、归一化、可重入及阻塞等问题,以确保系统的稳定性和可靠性。解决方案包括设置锁超时、引入Watch Dog机制、使用ThreadLocal绑定加解锁操作、实现计数器支持可重入锁以及采用自旋锁思想处理阻塞请求。
59 16
|
1月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
43 5