分布式任务调度平台一站式讲解

文章目录

          • 一、传统的定时任务
            • 1. 传统的定时任务存在那些缺点
            • 2. 分布式任务调度
            • 3. 定时任务集群幂等性问题
          • 二、传统定时任务的实现方案
            • 2.1. 多线程
            • 2.2. TimeTask
            • 2.3. 线程池
            • 2.4. SpringBoot注解形式
            • 2.5. 基于Quartz
          • 三、常⻅分布式定时任务
            • 3.1. Quartz
            • 3.2. TBSchedule
            • 3.3. Elastic-job
            • 3.4. XXL-JOB
          • 四、分布式任务调度平台架构设计原理
            • 4.1. xxl-job项目模块讲解
            • 4.2. 最佳实战
            • 4.3. Xxl-job定时任务框架实现原理
          • 五、常见面试题
            • 5.1. XXL-JOB与ElasticJob区别之间区别
            • 5.2. 分布式任务调度分片集群策略原理
            • 5.3. 如何保证任务调度平台高可用问题
          • 六、XXL-Job集群部署和⾼可⽤最佳实战

XXL开源社区

一、传统的定时任务
1. 传统的定时任务存在那些缺点

传统任务调度存在的缺陷

  • 1.业务逻辑与定时任务逻辑放入在同一个Jar包中,如果定时任务逻辑挂了也会影响到业务逻辑;
  • 2.如果服务器集群的情况下,可能存在定时任务逻辑会重复触发执行;
  • 3.定时任务执行非常消耗cpu的资源,可能会影响到业务线程的执行
2. 分布式任务调度

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

  • 1、多台机器集群部署的定时任务如何保证不被重复执行?
  • 2、如何动态地调整定时任务的执行时间?(不重启服务的情况)
  • 3、部署定时任务的机器发生故障如何实现故障转移?
  • 4、如何对定时任务进行监控、告警、高可用?
  • 5、定时任务统一调度管理,和追踪各个的服务节点之间任务调度的结
    果,并保存记录任务信息等等
3. 定时任务集群幂等性问题

定时任务集群,如何保证定时任务幂等性问题
如何在集群中,保证我们的定时任务只会触发一次

  • 1.将业务逻辑和定时任务逻辑完全分开部署,实现解耦、只对业务逻辑实现集群,不对我们的定时任务逻辑集群;—定时任务单机版本 缺点无法实现高可用的问题;
  • 2.对我们Jar包加上一个开关,项目启动的时候读取该开关 如果为true的情况下则加载定时任务类,否则情况下就不加载该定时任务类;–缺点无法实现高可用的问题;
  • 3.在数据库加上一个主键能够创建成功,则触发定时任务,否则就不触发定时任务, 高可用的问题;
  • 4.分布式锁实实现,只要jar能够拿到分布式锁就能够执行定时任务,否则情况下不执行;

总结:以上的方案都是属于规模比较小的项目,在微服务架构中应该采用分布式任务调度平台。

二、传统定时任务的实现方案

多线程形式、timetask、线程池(ScheduledExecutorService)、SpringBoot注解形式(EnableScheduling +@Scheduled底层依然是采用 Spring Task )、quartz

2.1. 多线程

基于多线程方式实现

package com.gblfy;public class ThreadTask {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(1000);System.out.println("定时任务触发...");} catch (InterruptedException e) {}}}}).start();}
}
2.2. TimeTask
package com.gblfy;import java.util.Timer;
import java.util.TimerTask;public class TimerTaskDemo {public static void main(String[] args) {TimerTask timerTask = new TimerTask() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "定时任务触发");}};// 天数long delay = 0;// 耗秒数long period = 1000;new Timer().scheduleAtFixedRate(timerTask, delay, period);}
}
2.3. 线程池
package com.gblfy;import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class ScheduledExecutorServiceDemo {public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("定时任务触发..");}};ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);scheduledExecutorService.scheduleAtFixedRate(runnable, 1, 1, TimeUnit.SECONDS);}
}
2.4. SpringBoot注解形式
package com.gblfy;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@EnableScheduling
@SpringBootApplication
public class ScheduledTaskApplication {public static void main(String[] args) {SpringApplication.run(ScheduledTaskApplication.class, args);}}
package com.gblfy;import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class UserScheduled {@Scheduled(cron = "0/1 * * * * *")public void taskUserScheduled() {System.out.println("定时任务触发...");}}
2.5. 基于Quartz
  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- quartz --><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.3.2</version></dependency>

MyJob

package com.gblfy.job;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;public class MyJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {System.out.println("quartz MyJob date:" + System.currentTimeMillis());}
}

QuartzTest

package com.gblfy.job;import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;import java.util.Date;public class QuartzTest {public static void main(String[] args) throws SchedulerException {//1.创建Scheduler的工厂SchedulerFactory sf = new StdSchedulerFactory();//2.从工厂中获取调度器实例Scheduler scheduler = sf.getScheduler();//3.创建JobDetailJobDetail jb = JobBuilder.newJob(MyJob.class).withDescription("this is a ram job") //job的描述.withIdentity("ramJob", "ramGroup") //job 的name和group.build();//任务运行的时间,SimpleSchedle类型触发器有效long time = System.currentTimeMillis() + 3 * 1000L; //3秒后启动任务Date statTime = new Date(time);//4.创建Trigger//使用SimpleScheduleBuilder或者CronScheduleBuilderTrigger t = TriggerBuilder.newTrigger().withDescription("").withIdentity("ramTrigger", "ramTriggerGroup")//.withSchedule(SimpleScheduleBuilder.simpleSchedule()).startAt(statTime)  //默认当前时间启动.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) //两秒执行一次.build();//5.注册任务和定时器scheduler.scheduleJob(jb, t);//6.启动 调度器scheduler.start();}
}
三、常⻅分布式定时任务
3.1. Quartz

Quartz关注点在于定时任务⽽并⾮是数据,并没有⼀套根据数据化处理⽽定的流程
虽然可以实现数据库作业的⾼可⽤,但是缺少了分布式的并⾏调度功能,相对弱点
不⽀持任务分⽚、没UI界⾯管理,并⾏调度、失败策略等也缺少

3.2. TBSchedule

这个是阿⾥早期开源的分布式任务调度系统,使⽤的是timer⽽不是线程池执⾏任务调度,使⽤timer在处理异常的时候是有缺陷的,但TBSchedule的作业类型⽐较单⼀,⽂档也缺失得⽐较严重
⽬前阿⾥内部使⽤的是ScheduleX
阿⾥云也有商业化版本: https://help.aliyun.com/product/147760.html

3.3. Elastic-job

当当开发的分布式任务调度系统,功能强⼤,采⽤的是zookeeper实现分布式协调,具有⾼可⽤与分⽚。
2020年6⽉,ElasticJob的四个⼦项⽬已经正式迁⼊Apache仓库由 2 个相互独⽴的⼦项⽬ ElasticJob-Lite 和 ElasticJobCloud 组成ElasticJob-Lite 定位为轻量级⽆中⼼化解决⽅案,使⽤jar的形式提供分布式任务的协调服务;ElasticJob-Cloud 使⽤ Mesos 的解决⽅案,额外提供资源治理、应⽤分发以及进程隔离等服务
地址:https://shardingsphere.apache.org/elasticjob/index_zh.html

3.4. XXL-JOB

⼤众点评的员⼯徐雪⾥在15年发布的分布式任务调度平
台,是轻量级的分布式任务调度框架,⽬标是开发迅速、
简单、清理、易扩展; ⽼版本是依赖quartz的定时任务触
发,在v2.1.0版本开始 移除quartz依赖
地址:https://www.xuxueli.com/xxl-job

四、分布式任务调度平台架构设计原理
4.1. xxl-job项目模块讲解

xxl-job-admin—分布式任务调度中心平台
xxl-job-core—源码实现部分
xxl-job-executor-samples–执行器项目 定时任务模块项目

执行器模块:(注册中心)存放实际执行我们定时任务项目模块IP和端口信息;
分布式任务调度中心(Nginx):负责所有执行器执行定时任务的分配;

4.2. 最佳实战

定时任务与业务逻辑实现解耦,分开部署。
定时任务是一个单独的项目。
gblfy-member—会员服务接口
member-job----负责会员服务定时任务

4.3. Xxl-job定时任务框架实现原理
  1. 当我们的定时任务模块项目启动的时候,会将该ip和端口信息注册到 定时任务注册中心上并发送rest请求
  2. 需要将定时任务创建在任务调度中心中,关联执行器 定时任务模块实际执行ip和端口号码。
  3. 创建定时任务会在xxl-job admin 调度中心中项目先触发,从执行器注册中心查找到执行器接口信息,采用路由策略(负载均衡算法)选择一个执行器(定时任务)地址 发送通知执行定时任务。

建议:配置定时任务规则的时候,建议提前5-10s;

在这里插入图片描述
常用分布式任务调度框架
Xxl-job、elasticjob、SpringAlibaba Cloud SchedulerX
XXL-Job Admin如何实现集群
在这里插入图片描述

五、常见面试题
5.1. XXL-JOB与ElasticJob区别之间区别

XXL-JOB内置定时任务调度中心,ElasticJob借助于zookeeper作为注册中心

对⽐项XXL-JOBelastic-job
并⾏调度调度系统多线程并⾏任务分⽚的⽅式并⾏
弹性扩容使⽤Quartz基于数据库分布式功能通过zookeeper保证
⾼可⽤通过DB锁保证通过zookeeper保证
阻塞策略单机串⾏/丢弃后续的调度/覆盖之前的调度执⾏超过zookeeper的session timeout
时间的话,会被清除,重新进⾏分⽚
动态分⽚策略以执⾏器为维度进⾏分⽚、⽀持动态的扩容平均分配/作业名hash分配/⾃定义策略
失败处理策略失败告警/失败重试执⾏完毕后主动获取未分配分⽚任务,
服务器下线后主动寻找可以⽤的服务器执⾏任务
监控⽀持⽀持
⽇志⽀持⽀持
5.2. 分布式任务调度分片集群策略原理

在这里插入图片描述

执行器集群部署时,任务路由策略选择”分片广播”情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;

“分片广播” 以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。

“分片广播” 和普通任务开发流程一致,不同之处在于可以获取分片参数,获取分片参数进行分片业务处理。

5.3. 如何保证任务调度平台高可用问题

调度中心集群(可选):
调度中心支持集群部署,提升调度系统容灾和可用性。

调度中心集群部署时,几点要求和建议:

  • 1.DB配置保持一致;

  • 2.集群机器时钟保持一致(单机集群忽视);

  • 建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回调配置、调用API服务等操作均通过该域名进行。

执行器集群(可选):
执行器支持集群部署,提升调度系统可用性,同时提升任务处理能力。
执行器集群部署时,几点要求和建议:

  • 1.执行器回调地址(xxl.job.admin.addresses)需要保持一致;执行器根据该配置进行执行器自动注册等操作。
  • 2.同一个执行器集群内AppName(xxl.job.executor.appname)需要保持一致;调度中心根据该配置动态发现不同集群的在线执行器列表。
六、XXL-Job集群部署和⾼可⽤最佳实战

XXL-Job集群部署和⾼可⽤最佳实战

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库系统 - 范式

第一范式 关系模式R中&#xff0c;当且仅当所有域只包含原子值&#xff0c;即每个分量都是不可分割的数据项&#xff1b; 第二范式 当且仅当R满足第一范式&#xff0c;且主键为多个属性值组成&#xff0c;且每个非主属性都完全依赖主键&#xff1b; 第三范式 当且仅当R满足…

全球CT影像20秒诊断,阿里云为新冠AI辅助诊断系统加速

新冠病毒全球爆发 2020年注定是不平凡的一年&#xff0c;新型冠状病毒肆虐全球&#xff0c;对于每个人来说都是一场灾难。 根据丁香园统计的数据&#xff0c;截止到2020年5月29日&#xff0c;全球新冠&#xff08;COVID-19&#xff09;累计确诊病例5,593,631人&#xff0c;累计…

麒麟信安操作系统:挖掘场景,与云俱进 ——携手openEuler赋能关键行业应用

12月24日&#xff0c;由中国电子技术标准化研究院、中国软件行业协会、绿色计算产业联盟主办&#xff0c;华为、飞腾、麒麟信安等操作系统厂商协办的操作系统产业峰会在北京成功举行。湖南麒麟信安科技股份有限公司作为华为重点邀请的四家openEuler商业发行版企业代表&#xff…

IDEA中导入VUE后,JS文件爆红解决办法

原因&#xff1a;可能是js版本不兼容的问题&#xff0c;修改如下图: 点击File–>settings&#xff0c;搜索&#xff1a;JavaScript&#xff0c;如图修改

带你一文看懂 Blockchain + NoSQL数据库

来源 | Tyler Mitchell译者 | 火火酱&#xff0c;责编 | Carol图源 | CSDN下载自视觉中国NoSQL数据库和现代区块链分类账都受益于一套共同的原则。由于其二者平台可以相互补充&#xff0c;因此当它们服务于同一应用程序时&#xff0c;能够配合完成多种工作。在本文中&#xff0…

来,一起“八卦”一下数据湖

原文链接 本文为云栖社区原创内容&#xff0c;未经允许不得转载。

从OpenKruise用户疑问开始理解K8s资源更新机制

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 背景 OpenKruise 是阿里云开源的大规模应用自动化管理引擎&#xff0c;在功能上对标了 Kubernetes 原生的 Deployment / Sta…

学霸的奇葩选择,成功不仅靠运气,对话阿里云MVP黄胜蓝

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 简介&#xff1a; 为了逃避高考&#xff0c;他凭借NOIP一等奖成功保送武大&#xff1b;大学时就负责校园门户网站的运维工作&…

CSDN湘苗培优|保持热情,告别平庸

湘苗培优招生进行中在培优中&#xff0c;遇见更好的自己——CSDN高校俱乐部CSDN湘苗培优随着我国信息产业飞速发展&#xff0c;通过常规灌输式培养出来的学员已经不能够满足企业要求。企业更缺乏的是具备自主学习能力、具备综合解决问题能力的高素质技术人才。高素质技术人才需…

对话阿里云总裁张建锋:解密阿里云再生长的动力、合力和张力

文 |《财经》记者 谢丽容 秋冬交替往往在一夜之间。这一年&#xff0c;受疫情的客观影响&#xff0c;数字化新旧时代的交替&#xff0c;从稳步推进&#xff0c;转变为一夜之间——数字化成为中国经济的主要驱动力&#xff0c;变革因为疫情而更加强烈&#xff0c;政府、企业都认…

掌门1对1微服务体系Solar|阿里巴巴Sentinel落地实践

前言 掌门1对1精耕在线教育领域&#xff0c;近几年业务得到了快速发展&#xff0c;但同时也遭遇了“成长的烦恼”。随着微服务数量不断增加&#xff0c;流量进一步暴增&#xff0c;硬件资源有点不堪重负&#xff0c;那么&#xff0c;如何实现更好的限流熔断降级等流量防护措施…

湘苗培优|值不值?效果告诉你

號外高校俱乐部报名ing湘苗培优REC等待优秀的你!湘苗培优参与项目交付企业内推求职简历指导CSDN技术认证你能获得优秀的企业导师&#xff01;志同道合的朋友锻造自己的平台&#xff01;面对面的交流这里有介绍湘苗培优缘起随着我国信息产业飞速发展&#xff0c;通过常规灌输式培…

Redis 分布式集群搭建2022版本+密码(linux环境)

Linux环境 安装 Redis-6.2.6 配置运行_01 https://gblfy.blog.csdn.net/article/details/105583077 文章目录一、节点分布总览二、软件配置初始化2.1. 下载2.2. 解压2.3. 编译安装2.4. 配置抽离2.5. 配置编辑2.6. 101节点操作2.7. 102 节点操作2.8. 103节点操作三、软件配置集群…

CDN百科第三讲|如果用了云服务器,还需要做CDN加速吗?

在全站上云的背景下&#xff0c;云计算已经不仅仅是大型互联网公司的独享概念&#xff0c;正在被更多的传统企业、中小企业甚至个人站长所采用。在众多云计算服务中&#xff0c;最常见两个产品就是云服务器和CDN&#xff0c;今天的CDN百科第三讲&#xff0c;就给大家介绍下你关…

如何选择适合你的企业数据管理类产品

在全站上云的背景下&#xff0c;云计算已经不仅仅是大型互联网公司的独享概念&#xff0c;正在被更多的传统企业、中小企业甚至个人站长所采用。在众多云计算服务中&#xff0c;最常见两个产品就是云服务器和CDN&#xff0c;今天的CDN百科第三讲&#xff0c;就给大家介绍下你关…

5G与金融行业融合应用的场景探索

来源 | 人民数字FINTECH责编 | 晋兆雨头图 | 付费下载于视觉中国5G 技术如何与银行、保险、证券业结合&#xff1f;近年来&#xff0c;金融业高度关注5G技术应用&#xff0c;一些金融机构希望抓住5G应用发展窗口期&#xff0c;积极探索新业态和新模式&#xff0c;把握5G金融应用…

云端研发新基建:Serverless与持续架构服务落地实践

在《我心中的云时代原生开发环境》这篇文章中&#xff0c;我们探讨过云厂商的愿景&#xff0c;云计算的趋势与现状以及研发团队的架构服务诉求等背景。今天&#xff0c;我想结合我们打造的云开发平台&#xff08;Cloud Workbench&#xff09;跟大家进一步聊聊&#xff0c;如何打…

vue pdfjs 在线预览

下载pdfjs 官网&#xff1a;http://mozilla.github.io/pdf.js/getting_started/#download 放入项目中 将下载下来的文件解压缩后&#xff0c;重命名为pdf&#xff0c;将里面的pdf文件夹拷贝到项目中的public文件夹中 页面中使用 <template><div class"container…

年终福利 | “社区之星”(社区核心贡献者)成长故事征集

活动简介那些积极探索技术边界并持续对社区做出贡献的开发者是真正的技术英雄&#xff0c;是开发者的学习榜样&#xff0c;也是各个技术社区发展的生命力&#xff01;2020年即将结束&#xff0c;CSDN 为所有技术社区特别准备了一份年终福利&#xff01;CSDN 向所有技术社区&…

阿里云峰会|数据库也能自动驾驶?DAS全天候给你保驾护航!

阿里云峰会直播地址 2020年6月9日&#xff0c;“全速重构”2020阿里云线上峰会即将隆重召开。 在此次峰会上&#xff0c;阿里云数据库重磅发布云原生分布式数据库 PolarDB-X 、云原生数据仓库AnalyticDB、数据库自治服务DAS、云数据库专属集群、图数据库GDB、云数据库Cassandr…