XXL-JOB内部机制大揭秘,任务飞起来!

开发 前端
通过对XXL-JOB内部机制的揭秘,我们可以看到它在任务调度方面的强大功能和高效实现。从调度中心到执行器,从时间轮调度到任务分配与执行,再到弹性扩容缩容、丰富的触发策略和任务失败重试与告警等高级特性,XXL-JOB以其轻量级、易扩展、高性能的特点赢得了市场的认可。

今天我们给大家分享一下XXL-JOB这个框架的内部运行机制,因为大家平时开发系统的时候肯定会遇到后台调度任务的相关功能开发吧,比如说系统需要定时跑个什么任务做一些数据处理的工作,或者是数据检查的工作这类的,这些都是要开后台调度任务的。

那什么是后台调度任务?说白了其实就是你系统启动后开个线程后台自己跑,执行任务,这就是后台调度任务了,你的线程里可以设置一个while循环,如果任务没结束就一直在while循环里重复执行一些代码,每次执行还可以sleep一段时间,那就每次执行都有一个时间间隔了,这就是最简单的调度任务。

那自己搞线程有什么问题?问题大了,你线上系统一般都是多机器部署的吧,那每个机器上启动的系统进程是不是都有自己的调度线程?那不同的调度线程之间怎么协调?会不会并发更新数据,导致脏数据?你是不是还要引入分布式锁来处理?所以类似这种多台机器上同时启动调度线程的就是分布式任务调度了,为啥叫分布式,因为你多台机器一起跑调度线程啊,可不是分布式吗?

分布式的意思就是分布在多台机器上,大家一定要明白这个点。

而且一般我们开发的系统都是面向web的系统,一般都是web来了请求或者是内部其他系统来了rpc调用,我们系统接口开始跑代码,系统的运行模型不是那种定时调度的,所以其实把调度线程混合在系统里也不好,这个时候就可以当当当当了,所以引入一个专门的分布式任务调度系统,来专门跑各种我们的调度任务代码。

那国内这块用的比较多的开源的分布式任务调度系统有比较知名的就是elastic-job,还有就是xxl-job,其实干的事儿都差不多,就是可以把独立的开源调度系统部署在多台机器上,每台机器都可以跑很多调度任务,我们就把自己的调度任务代码提交给他,然后设置好调度策略就可以了,他就会自己按照策略调度执行任务了。

所以今天分享的重点就是xxl-job这个框架的内部工作机制了!

那我们来进入主题了,那在软件开发的世界里,定时任务调度是不可或缺的一环。想象一下,系统需要定时备份数据、清理日志、发送提醒邮件,这些工作如果靠人工来完成,那得多低效啊!这时候,一个强大的任务调度平台就显得尤为重要了。而XXL-JOB,作为分布式任务调度领域的佼佼者,凭借其轻量级、易扩展、高性能的特点,赢得了众多开发者的青睐。今天,咱们就来揭开XXL-JOB的神秘面纱,看看它如何让任务“飞起来”!

一、XXL-JOB是什么?

首先,咱们得明确一下,XXL-JOB到底是个啥?简单来说,它就是一个分布式任务调度平台,专门用来管理和调度定时任务。这个平台由调度中心和执行器两部分组成,调度中心负责任务的分配和调度,执行器则负责具体执行这些任务。通过这样的设计,XXL-JOB实现了调度与任务的解耦,提高了系统的稳定性和扩展性。

二、XXL-JOB的核心组件

调度中心(XXL-JOB-ADMIN)

调度中心是XXL-JOB的大脑,它负责管理所有的调度信息,包括任务信息、执行器信息等。它就像一个指挥官,根据任务的配置信息和执行器的注册信息,制定出合理的调度计划,并在适当的时候将任务分配给执行器去执行。

调度中心的主要功能包括:

  • 任务管理:新增、修改、删除任务,设置任务的触发条件等。
  • 执行器管理:注册、注销执行器,监控执行器的状态等。
  • 日志管理:查看任务的执行日志,便于问题排查。

调度中心支持集群部署,通过数据库锁的方式保证任务在同一时间只会被一个调度中心实例触发一次,提高了系统的容错性和可用性。

执行器(XXL-JOB-EXECUTOR)

执行器是XXL-JOB的手脚,它负责接收调度中心分配的任务,并执行具体的任务逻辑。执行器可以部署在多个服务器上,形成执行器集群,从而实现任务的分布式执行。

执行器的主要功能包括:

  • 任务执行:接收调度中心的任务请求,执行具体的任务逻辑。
  • 结果回调:将任务的执行结果回调给调度中心,供用户查看。
  • 心跳检测:周期性地向调度中心发送心跳信息,证明自己的存活状态。

三、XXL-JOB的调度机制

时间轮调度

XXL-JOB的调度机制借鉴了Netty中的HashedWheelTimer,采用了类似时间轮的调度方式。时间轮是一个环形结构,可以想象成一个时钟,钟面上有很多格子(bucket),每个格子上可以存放多个任务。随着时间的流逝,时间轮上的指针会一格一格地转动,并执行对应格子上的任务。

在XXL-JOB中,时间轮被简化成了60个bucket,每个bucket代表1秒。调度中心内部有两个重要的线程:scheduleThread和ringThread。scheduleThread负责预读未来5秒内即将触发的任务,并将它们放入时间轮中。ringThread则负责检查当前bucket和前一个bucket中的任务,并取出执行。

这种调度方式的好处在于,它能够在内存中以极低的成本维护一个高效的任务调度队列,避免了频繁访问数据库带来的性能开销。

任务分配与执行

当任务到达触发时间时,调度中心会根据任务的配置信息和执行器的注册信息,选择合适的执行器来执行任务。这里涉及到XXL-JOB的路由策略,包括第一个、最后一个、轮询、随机、一致性Hash等多种策略。

  • 第一个/最后一个:直接选择注册列表中的第一个或最后一个执行器。
  • 轮询:依次选择注册列表中的执行器,实现负载均衡。
  • 随机:随机选择一个执行器来执行任务。
  • 一致性Hash:通过一致性Hash算法,将任务均匀分配到各个执行器上,实现负载均衡的同时,减少节点增减对任务分配的影响。

执行器接收到任务后,会基于线程池执行任务,并将执行结果放入内存队列中。执行器的回调线程会消费这个队列中的结果,并主动上报给调度中心。用户可以在调度中心查看任务的执行日志和结果。

四、XXL-JOB的高级特性

弹性扩容缩容

XXL-JOB支持执行器的动态注册和注销,这意味着当有新的执行器机器上线或者下线时,调度中心能够在下次调度时重新分配任务,实现弹性扩容缩容。这种特性使得XXL-JOB能够轻松应对业务量的变化,提高系统的灵活性和可扩展性。

丰富的触发策略

XXL-JOB提供了多种任务触发策略,包括Cron触发、固定间隔触发、固定延时触发、API触发、人工触发、父子任务触发等。这些触发策略可以满足不同场景下的需求,使得任务调度更加灵活和高效。

任务失败重试与告警

当任务执行失败时,XXL-JOB支持自定义任务失败重试次数,并在达到重试次数上限后发送告警通知。告警方式包括邮件、短信等多种方式,用户可以根据实际需求进行配置。这种机制保证了任务的高可用性和可靠性。

五、总结

通过对XXL-JOB内部机制的揭秘,我们可以看到它在任务调度方面的强大功能和高效实现。从调度中心到执行器,从时间轮调度到任务分配与执行,再到弹性扩容缩容、丰富的触发策略和任务失败重试与告警等高级特性,XXL-JOB以其轻量级、易扩展、高性能的特点赢得了市场的认可。如果你正在寻找一个稳定可靠的分布式任务调度平台来优化你的系统架构和提升业务效率那么XXL-JOB绝对值得你一试!让任务飞起来不再是梦!

责任编辑:武晓燕 来源: 石杉的架构笔记
相关推荐

2022-09-23 13:57:11

xxl-job任务调度中间件

2022-03-26 17:13:22

ElasticJobxxl-job分布式

2020-07-17 09:33:39

CPU内存调度

2023-01-04 09:23:58

2024-09-09 08:11:12

2024-07-31 08:18:40

2020-09-29 07:54:05

Express 飞起

2011-04-13 10:51:58

MATLAB

2022-01-27 08:44:58

调度系统开源

2022-12-29 08:32:50

xxl-job缓存Schedule

2023-06-27 07:44:53

xxl-job分布式任务调度平台

2011-05-20 11:12:01

数据库DB2优化

2021-07-13 07:52:03

SQL面试COUNT(*)

2020-12-31 07:59:11

SaaS软件即服务软件

2023-11-30 22:06:43

2011-05-11 11:32:35

数据库DB2优化技巧

2019-03-25 08:05:35

Elasticsear优化集群

2016-01-19 17:03:59

数据中心网络华为

2022-09-02 08:21:24

idea插件

2013-01-07 09:34:43

CodeLoveBAT
点赞
收藏

51CTO技术栈公众号