全面揭秘分布式任务调度平台
- java实现定时job的方案
Thread,TimerTask,线程池,quartz,springboot内置schedul- 每隔一秒钟执行一次任务利用thread来实现。
- TimerTask new出Timertask的类,实现的方法为run方法里面写上自己的任务 jdk自带的
触发的规则 Timer time=newTimer();
long delay =0; 触发天数 long period = 1000; 触发毫秒数 time.scheduleAtFixedRate(timertask,delay,period);
不适合服务器端 - 使用线程池方式 可以利用定时的线程池出来 Executors.newSingleThreadScheduledExecutor();
调用runnable的对象重写run方法再将runnable对象传入下面的方法中。
再调用scheduleAtFixedRate(runnable ,1,1,TimeUnit.SECONDS); - quartz实现方式
corn表达式网上可以找spring在2.0的时候支持quartz框架 cron.qqe2.com这个网站可以自动生成corn表达式
定时任务执行,先实现接口job,所以这个类就是将要执行的任务
不需要写这个代码,只要换一下要执行的class类和corn表达式
- 传统的定时任务
传统定时任务和分布式的区别
传统是不需要集群的单点系统job不需要集群
大公司的job和系统的服务器是分开的
job服务器在高并发的时候,定时job宕机下怎么做:利用心跳检测自动重启,补偿机制(标识一下)看看是否完成
定时任务中间报错了怎么处理(日志记录错误,跳过继续执行)在使用job定时任务查看日志进行补偿信息。
定时任务报异常结束怎么办(发送邮件给运维入人员) - 分布式定时任务xxl-job
项目会做集群,利用Nginx实现负载均衡,定时任务在每个war包中都是相同的,job定时任务会重复执行怎么做?- 首先用zookeeper实现分布式锁(效率不是很高)
- 配置文件中加上启动定时任务的开关(在三个war包的代码相同,在第一个war包中加上一个开关flag)
- 启动时候使用数据库的唯一标识(不推荐)
- 分布式任务调度平台(xxL-job框架)(Elastric-job依赖zk)
- 分布式任务调度平台能帮我们实现哪些事情
支持集群可以保证幂等性问题
支持job补偿 多次失败后发送邮件个运维人员
支持job的日志记录 - 传统job的定时规则是写死的,利用动态配置定时规则
- xxl-job的原理:执行器,任务管理(xxl-job admin平台独立的web服务)
执行器:定时job实际执行的服务地址
任务管理:配置定时任务规则,路由策略,允许模式,等
步骤:- 在xxl-job平台创建执行器 (job实际执行地址)
- 在xxl-job平台新建任务,填写对应的执行器
- 在job服务器代码中,使用@jobHandler标识该类为job执行方法
- 如果有任务执行的话,现在平台执行一次,获得任务中执行器,在平台注册一下,之后再任务管理中添加任务就可以了。
- 任务执行器要继承IJobHandler这个抽象类统一方法名称。
- jobHandler中配置value的值
- xxl-job的基本常识(xxl-job就是quartz的包装实现分布式job主讲xxl-job的)
大型的互联网公司会有专门的分布式任务调度平台管理公司所有项目job。
调度平台的路由策略(与Nginx的负载均衡差不多):- 第一个
- 最后一个
- 轮询
- 故障转移模式:很像一主一备机
- 随机
- 最不经常使用
- 一致性hash
- 分片广播:一次性调度触发所有的执行器
支持邮件服务
- 搭建高可用集群版本分布式调度任务
平台的执行过程是:
先启动执行器,在将执行器注册到注册中心去,注册中心通过路由算法jobHandler再调用反射执行相应的执行器去执行。
如果admin平台(调度中心)挂掉后怎么办?- 会造成所有的执行器执行不了。
- 如何把调度中心建立集群?
要有的问题 定时数据任务都需要相同(出现任务的重复执行)xxl-job如何实现集群,其实底层实现好了。
文档说想实现集群要求:- DB配置保持一致:(操作同一个数据库不会产生数据的重复问题)
- 登录账号配置保持一致
- 集群机器时钟保持一致(单机忽略)
- 建议:推荐使用Nginx为调度中心集群做负载均衡,分配域名。调度中心访问,执行器回调配置,调用api服务等操作均通过该域名进行。
- 搭建集群的调度平台:
- 先配置Nginx的负载均衡
- 其实就是实现主备关系。
- 一次只能在一台xxl-job中执行。
- springboot平台整合xxl-job
- 将对应的xxl-job文件的jar包和版本号添加剩下的直接照抄
- 接下来就可以测试了。
- 其他分布式任务调度平台 Quartz ,TBSchedule,Elastic-job
quartz:这个就是相当于xxl-job(底层就用的就是quartz) - 如何解决分布式定时任务幂等性问题
通过分布式配置中心xxl-job来解决这个问题,但是如果配置中心宕机了就会造成系统的定时任务失败,可以利用nginx来配置主备两台机器,可以解决这个问题。