热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分布式定时调度XXLJOB

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

XXL-JOB


背景:

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


分布式任务存的在问题以及解决方案:

问题:
分布式集群的模式下,如果采用集中式的任务调度方式,会带来一些问题,比如:
1、多台机器集群部署的定时任务如何保证不被重复执行?
2、如何动态地调整定时任务的执行时间?(不重启服务的情况)
3、部署定时任务的机器发生故障如何实现故障转移?
4、如何对定时任务进行监控?
5、业务量比较大,单机性能的瓶颈问题,如何扩展?
等等问题
解决方案:
1、数据库唯一约束,避免定时任务重复执行(类似于分布式锁,插入成功执行,否则不执行);
2、使用配置文件:redis、mysql作为调度的开关(存入执行机器的ip);
3、使用分布式锁实现调度的控制;
4、使用分布式任务调度平台TBSchedule(淘宝)、Elastic-Job(当当)、Saturn(唯品会)、XXL-JOB(大众点评)、 Google Cron(谷歌)系统;
5、自研


原生定时任务框架存在的先天缺陷

1、不支持分片任务
  处理有序数据时,多机器分片执行任务处理不同数据
2、不支持生命周期统一管理
  不重启服务情况下关闭、启动任务。
3、不支持集群
  存在任务重复执行的问题
4、不支持失败重试
  出现异常后任务终结,不能根据执行状态控制任务重新执行
5、不支持动态调整
  不重启服务的情况下修改任务参数
6、无报警机制
  任务失败之后没有报警机制
7、任务数据统计难以统计
  任务数据量大时,对于任务执行情况无法高效的统计执行情况


XXL-JOB与Quartz对比

1、调用API的的方式操作任务,不人性化 ;
2、需要持久化业务QuartzJobBean到底层数据表中,系统侵入性相当严重。
3、调度逻辑和QuartzJobBean耦合在同一个项目中,这将导致一个问题,在调度任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况加,此时调度系统的性能将大大受限于业务;
4、quartz底层以“抢占式”获取DB锁并由抢占成功节点负责运行任务,会导致节点负载悬殊非常大;而XXL-JOB通过执行器实现“协同分配式”运行任务,充分发挥集群优势,负载各节点均衡。
XXL-JOB弥补了quartz的上述不足之处。


XXL-JOB概述:

美团开源的一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,例如:京东,优信二手车,北京尚德,360金融 (360),联想集团 (联想),易信 (网易)等等。
官网:http://www.xuxueli.com/xxl-job
Github:https://github.com/xuxueli/xxl-job


XXL-JOB框架:

请添加图片描述
在这里插入图片描述
服务端(调度中心):就是一个web管理后台
客户端(执行器):就是我们写的代码,这个代码里面执行定时任务的业务逻辑
心跳机制:
请添加图片描述
RPC:
1、客户端client发起服务调用请求。
2、client stub 可以理解成一个代理,会将调用方法、参数按照一定格式进行封装,通过服务提供的地址,发起网络请求。
3、消息通过网络传输到服务端。
4、server stub接受来自socket的消息。
5、server stub将消息进行解包、告诉服务端调用的哪个服务,参数是什么。
6、结果返回给server stub。
7、sever stub把结果进行打包交给socket
8、socket通过网络传输消息。
9、client stub 从socket拿到消息。
10、client stub解包消息将结果返回给client。


XXL-JOB特性:


  • 简单:支持通过Web页面对任务进行CRUD操作,操作简单。
  • 动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效。
  • 注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址。
  • 故障转移:任务路由策略选择"故障转移"情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。
  • 任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务。
  • 分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务。
  • 邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件。等等

版本变化(2.3.0):

1、【新增】调度过期策略:调度中心错过调度时间的补偿处理策略,包括:忽略、立即补偿触发一次等;
2、【新增】触发策略:除了常规Cron、API、父子任务触发方式外,新增提供 “固定间隔触发、(固定延时触发,实验中)” 新触发方式;
3、【新增】新增任务辅助工具 “XxlJobHelper”:提供统一任务辅助能力,包括:任务上下文信息维护获取(任务参数、任务ID、分片参数)、日志输出、任务结果设置……等;
  3.1、“ShardingUtil” 组件废弃:改用 “XxlJobHelper.getShardIndex()/getShardTotal();” 获取分片参数;
  3.2、“XxlJobLogger” 组件废弃:改用 “XxlJobHelper.log” 进行日志输出;
4、执行器注册组件优化:注册逻辑调整为异步方式,提高注册性能;
5、任务核心类 “IJobHandler” 的 “execute” 方法取消出入参设计。改为通过 “XxlJobHelper.getJobParam” 获取任务参数并替代方法入参,通过 “XxlJobHelper.handleSuccess/handleFail” 设置任务结果并替代方法出参,示例代码如下:

@XxlJob("demoJobHandler")
public void execute() {String param = XxlJobHelper.getJobParam(); // 获取参数XxlJobHelper.handleSuccess(); // 设置任务结果
}

6、任务调度生命周期重构:调度(schedule)、触发(trigger)、执行(handle)、回调(callback)、结束(complete);等等


XXL-JOB分布式任务调度平台实现

流程:
请添加图片描述
1、从github(https://github.com/xuxueli/xxl-job)获取项目源码;
2、从源码中得到SQL脚本创建和初始化数据库;请添加图片描述
请添加图片描述
3、修改admin配置文件;
请添加图片描述
请添加图片描述
4、配置执行器
请添加图片描述
在1号位置处配置修改:请添加图片描述
2号位置处是执行器示例
5、运行项目访问:http://localhost:8080/xxl-job-admin/toLogin请添加图片描述
用户名:admin
密码:123456
6、运行报表
请添加图片描述
7、执行器注册
请添加图片描述
8、任务配置
请添加图片描述
请添加图片描述


移植进入项目

1、pom添加依赖

<dependency><groupId>com.xuxueligroupId><artifactId>xxl-job-coreartifactId><version>2.3.0version>
dependency>

2、打包admin
3、移植config配置
在这里插入图片描述
4、测试执行器
在这里插入图片描述
移入项目成功


注意点

1、请添加图片描述
发生此问题是因为JDK版本过高&#xff0c;降低为1.8即可&#xff0c;但并不会影响使用
2、检查pom是否有以下依赖若没有运行会报错&#xff0c;请添加

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

集群
xxl-job-admin如果想实现Job集群需要实现&#xff1a;


  • DB配置一样
  • 登录账号一样
  • 集群机器时钟保持一致&#xff08;单机集群忽略&#xff09;

建议&#xff1a;推荐通过Nginx为调度中心集群做负载均衡&#xff0c;分配域名。调度中心访问、执行器回收配置、调用API服务等操作均通过该域名进行。
host文件配置
127.0.0.1 xxljob.mayikt.com
nginx配置

http {include mime.types;default_type application/octet-stream;upstream backserver {server 127.0.0.1:8080 weight&#61;1;server 127.0.0.1:8081 weight&#61;1;}server {listen 80;server_name xxljob.mayikt.com;location / {proxy_pass http://backserver;index index.html index.htm;}}
}

xxl-job执行器配置文件
xxl.job.admin.addresses&#61;http://127.0.0.1:8080/xxl-job-admin,http://127.0.0.1:8081/xxl-job-admin
xxl-job-admin&#xff0c;启动两个节点&#xff0c;端口分别为8080和8081
访问&#xff1a;http://xxljob.mayikt.com/xxl-job-admin
此时调度中心8080节点为主主节点&#xff0c;8081为从节点、
使用
浏览器访问nginx地址&#xff0c;转发到8080或8081 xxl-job-admin管理平台。
停掉8080主节点&#xff0c;此时调度中心到了8081备节点执行了。


推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Redis API
    安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
author-avatar
情都欧阳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有