热门标签 | 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备节点执行了。


推荐阅读
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • 本文详细介绍了如何在Linux系统(以CentOS为例)上彻底卸载Zimbra邮件系统,包括停止服务、删除文件和用户等步骤。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 为了确保数据库的高效运行,本文介绍了一种方法,通过编写定时任务脚本来自动清理 `order` 表中状态为 0 或为空的无效订单记录。该脚本使用 PHP 编写,并设置时区为中国标准时间,每 10 分钟执行一次,以保持数据库的整洁和性能优化。此外,还详细介绍了如何配置定时任务以及脚本的具体实现步骤。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • `chkconfig` 命令主要用于管理和查询系统服务在不同运行级别中的启动状态。该命令不仅能够更新服务的启动配置,还能检查特定服务的当前状态。通过 `chkconfig`,管理员可以轻松地控制服务在系统启动时的行为,确保关键服务正常运行,同时禁用不必要的服务以提高系统性能和安全性。本文将详细介绍 `chkconfig` 的各项参数及其使用方法,帮助读者更好地理解和应用这一强大的系统管理工具。 ... [详细]
  • 技术日志:Ansible的安装及模块管理详解 ... [详细]
  • 在项目开发过程中,掌握一些关键的Linux命令至关重要。例如,使用 `Ctrl+C` 可以立即终止当前正在执行的命令;通过 `ps -ef | grep ias` 可以查看特定服务的进程信息,包括进程ID(PID)和JVM参数(如内存分配和远程连接端口);而 `netstat -apn | more` 则用于显示网络连接状态,帮助开发者监控和调试网络服务。这些命令不仅提高了开发效率,还能有效解决运行时的各种问题。 ... [详细]
  • 如何在Linux系统中利用crontab定时执行Shell脚本任务?
    在Linux系统中,如何实现定时执行任务脚本?在服务器日常运维过程中,经常需要定期执行某些任务,例如数据库备份、日志文件切割等。通过使用crontab工具,可以轻松配置这些周期性任务,确保它们按时自动运行,提高系统管理效率和可靠性。 ... [详细]
  • HBase客户端Table类中getRpcTimeout方法的应用与编程实例解析 ... [详细]
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社区 版权所有