分布式任务调度XXL-JOB-第一章-概述及部署

一、背景概述

任务调度是日常开发中非常常见的一个业务场景,我们经常需要去运行一些周期性、指定时间点等方式自动触发的异步业务逻辑;

集中式任务调度

集中式任务调度与分布式任务调度切好相反的概念,集中式任务就是单机任务,一个项目,一台机器,也就是我们常说的单体应用;
对于集中式任务,也就是我们Java开发中常见的定时任务。
定时任务是指在指定的时间、指定的频率去执行任务(业务代码)

二、Java实现定时任务方式

1、 while(true) + Thread.sleep

轮训 + 线程休眠的方式实现定时任务;

2、 java.util.Timer + java.util.TimerTask

Timer是一种定时器工具,用来在一个后台线程计划执行指定任务,它可以计划执行一个任务一次或反复多次。
TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。

3、 ScheduledExecutorService

ScheduledExecutorService是从jdk1.5开始作为并发工具类被引入,是最理想的定时任务实现方式。它只能实现周期性任务,不能执行定时任务

4、Quartz

Quartz是一个开源的定时任务调度框架,由Java编写而成,用于Java生态下的定时任务调度,是一个灵活方便、使用简单的定时任务调度框架,可以和Spring整合使用。

5、Spring Task

Spring框架提供的轻量级定时任务调用工具,使用方便;

6、SpringBoot注解@EnableScheduling+@Scheduled

底层依然是使用Spring Task;

三、分布式任务调度

1、需要考虑的问题

分布式集群的模式下,如果采用集中式的任务调度方式,会带来一些问题,比如

  • 多台机器集群部署的定时任务如何保证不被重复执行
  • 如何动态地调整定时任务的执行时间(不重启服务的情况)
  • 部署定时任务的机器发生故障如何实现故障转移
  • 如何对定时任务进行监控
  • 业务量比较大,单机性能的瓶颈问题,如何扩展
  • 等等…

2、分布式任务调度解决方案

由于集中式的定时任务调度需要解决一系列问题,所以在演进的过程中产生一些解决办法:

  • 数据库唯一约束,避免定时任务重复执行
  • 使用配置文件、redis\mysql作为调度的开关;
  • 使用分布式锁实现调度的控制
  • 使用分布式任务调度平台TBSchedule、Elastric-Job、Saturn、XXL-JOB、Google Cron系统

3、自研的分布式任务调度平台

TBSchedule(现在是ScheduleX)

淘宝退出的开源的分布式任务调用系统,在很多互联网公司拟应用很广,但现在没有维护了,现在是ScheduleX

Elastic-Job

当当网推出的分布式任务调度框架,官网:http://elasticjob.io
有很多的公司使用。

Saturn

唯品会推出的开源分布式任务调度平台,它是基于Elastic-Job开发的,新增了一些特性,在唯品会内部及一些互联网公司使用

XXL-JOB

是美团开源的轻量级分布式任务调度平台,其核心设计目标是轻量级、易扩展、开发迅速、开箱即用,已有多家公司线上产品采用了xxl-job
该项目于2015年11月发布了第一个版本1.0,目前最新版本2.2.0
Github:https://github.com/xuxueli/xxl-job
Gitee:http://gitee.com/xuxueli0323/xxl-job
官网:https://www.xuxueli.com/xxl-job/

四、 XXL-JOB

1、整体架构

在这里插入图片描述

  • 服务端(调度中心)是一个web管理后台
  • 客户端(执行器)这个就是我们写的代码,这个代码里指定定时任务

2、路由策略

在这里插入图片描述

  • FIRST(第一个):固定萱蕚第一个机器
  • LAST(最后一个):固定选择最后一个机器
  • ROUND(轮训):每个机器轮流执行
  • RANDOM(随机):随机选择在线的机器
  • CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上
  • LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举
  • LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;
  • FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度
  • BUSYOVER(忙碌转移):按照顺序依次进行空你先按检测,第一个空闲检测成功的机器选定为目标执行器并发起调度
  • SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;

一致性hash算法参考:详解一致性hash算法

五、安装部署

1、源码编译安装

xxl-job是基于SpringBoot开发,所以可以直接编译jar执行,页面使用framemaker开发,可以根据实际场景进行二次开发扩展
在这里插入图片描述

2、docker安装

  • 1、把xxl-job的仓库拉下来
  • 2、执行/xxl-job/doc/db/tables_xxl_job.sql的脚本(创建对应的库、创建表以及插入测试数据记录)
  • 3、如果是本地启动「调度中心」则在xxl-job-admin的application.properties更改相应的数据库配置,改完启动即可
  • 4、如果是云服务启动「调度中心」,则可以选择拉取docker镜像进行部署,我拉取的是2.30版本,随后执行以下命令即可:
docker pull xuxueli/xxl-job-admin:2.3.0

创建容器

docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://mysql:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull --spring.datasource.username=demo --spring.datasource.password=123456 " \
-p 6767:8080 --name xxl-job-admin \
--net=mynet \
-v /etc/localtime:/etc/localtime \
-v /etc/timezone:/etc/timezone \
-d xuxueli/xxl-job-admin:2.3.0

注意:第二条命令的ip和password需要更改为自己的,并且,我开的是6767端口

如果是ARM aarch64架构

# 拉获镜像
docker pull h295203236/xxl-job-admin:2.3.0-aarch64
# 创建容器
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://mysql-8:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull --spring.datasource.username=root --spring.datasource.password=123456 " \
-p 6767:8080 --name xxl-job-admin \
--net=mynet \
-v /etc/localtime:/etc/localtime \
-v /etc/timezone:/etc/timezone \
-d h295203236/xxl-job-admin:2.3.0-aarch64

3、表结构

在这里插入图片描述

4、访问页面

http://192.168.0.44:6767/xxl-job-admin
用户名密码:admin/123456,数据存储在xxl_job_user表中
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值