给网站加个地图的代码,wordpress实现瀑布流,个人静态网站首页怎么做,图片海报制作软件目录
先了解什么是任务调度#xff1f;
什么是分布式任务调度#xff1f;
了解XXL-JOB分布式任务调度平台
如何搭建XXL-JOB#xff1f;
分片广播
作业分片方案 最近学习在项目的媒资管理模块如何高效处理大量视频#xff0c;上传单个视频可能涉及到转码#xff0c…目录
先了解什么是任务调度
什么是分布式任务调度
了解XXL-JOB分布式任务调度平台
如何搭建XXL-JOB
分片广播
作业分片方案 最近学习在项目的媒资管理模块如何高效处理大量视频上传单个视频可能涉及到转码内容审核等多个处理部分
如果采用传统的单线程处理模式可能会导致资源利用率低下所有操作依次排队会导致执行处理视频耗时较长效率不高的问题出现
因此在处理大量视频文件时我们需要学习更高效的任务处理方式如何高效满足这些视频处理需求
1.采用多线程
在处理大量视频任务时单线程处理效率较低无法充分利用系统资源。为了提高处理效率可以采用多线程技术来并发处理任务
核心思想是将一个任务拆分为多个子任务并发执行这些子任务充分利用CPU和内存资源提高任务处理效率
2.采用分布式架构多线程
通过分布式架构和多线程技术的结合最大化利用计算资源高效处理大规模任务例如我们所说的处理大量视频文件
采用分布式线程可扩展性更强同时它也是一种 分布式任务调度 的处理方案
先了解什么是任务调度
任务调度顾名思义就是对任务的调度它是指系统为了完成特定的业务基于给定的时间点给定的时间间隔或者给定执行次数自动执行任务
我们思考一下下面业务场景
某财务系统需要在每天上午10点结算前一天的账单数据统计汇总12306网站会根据车次不同设置几个时间点分批放票商品成功发货后需要向客户发送短信提醒
以上这些场景就是 任务调度 所需要解决的问题类似场景还有很多我们该如何实现这里我举例三种实现方法
1.多线程方式实现
回顾多线程思想当我们可以开启一个线程每sleep一段时间就去检查是否已经到预期执行时间
简单实现任务调度的功能按一定的间隔时间执行任务调度的功能
public static void main(String[] args){//任务执行时间间隔final long timeInterval 1000;Runnable runnable new Runnable()}{public void run(){while(true){//TODO:somethingtry{Thread.sleep(timeInterval);}catch(InterruptedException e){e.printStackTrace(); } }}};Thread thread new Thread(runnable); thread.start(); }
}
2.Timer 和 ScheduledExecutorJDK提供的相关支持是用于定时任务调度的工具类帮助我们在指定的时间点或周期性的执行任务
Timer的核心功能
单次任务在指定的延迟后执行一次任务周期性任务以固定的时间间隔重复执行任务
Timer的优点在于简单易用每个Timer对应一个线程因此可以同时启动多个Timer并行执行多个任务同一个Timer中的任务是串行执行
Timer方法的实现
public static void main(String[] args){Timer timer new Timer();timer.schedule(new TimerTask(){Overridepublic void run(){//TODO:someting }},1000,2000); //一秒开始调度每2秒执行一次}
ScheduledExecutor方式实现
public static void main(String [] args){//创建一个固定大小为10的线程池用于执行定时任务线程池中的线程可以并发执行多个任务ScheduledExecutorService service Executors.newScheduledThreadPool(10);service.scheduleAtFixedRate(new Runnable(){Override//任务逻辑是打印“todo something”public void run(){//TODO:somethingSystem.out.print(todo something);}//任务将在一秒后首次执行之后任务以每2秒执行一次},1,2,TimeUnit.SECONDS);
}scheduleAtFixedRate:
是用于以固定的速率调度任务任务会在指定的初始延迟后开始执行之后以固定的时间间隔重复执行 基于线程池设计的ScheduledExecutor其设计思想是每一个被调度的任务都会由线程池中一个线程去执行因为任务是并发执行的相互之间不会受到打扰 Timer和ScheduledExecutor都仅能提供基于开始时间与重复间隔的任务调度不能胜任更加复杂的调度需求 — 比如设置每月第一天凌晨1点执行任务复杂调度任务的管理任务间传递数据等等
3.再学习另一个功能强大的 任务调度框架Quartz它可以满足更多更复杂的调度需求Quartz设计的核心类包括SchedulerJob以及Trigger其中Job负责定义需要执行的任务Trigger负责设置调度策略Scheduler将两者组装起来并触发任务开始执行Quartz支持简单的按时间间隔调度还支持按日历调度方式通过设置CronTrigger表达式包括秒分时日月周年进行任务调度
public static void main(String [] agrs) throws SchedulerException {//创建一个SchedulerSchedulerFactory schedulerFactory new StdSchedulerFactory();Scheduler scheduler schedulerFactory.getScheduler();//创建JobDetailJobBuilder jobDetailBuilder JobBuilder.newJob(MyJob.class);jobDetailBuilder.withIdentity(jobName,jobGroupName);JobDetail jobDetail jobDetailBuilder.build();//创建触发的CronTrigger 支持按日历调度CronTrigger trigger TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName).startNow().withSchedule(CronScheduleBuilder.cronSchedule(0/2 * * * * ?)).build();scheduler.scheduleJob(jobDetail,trigger);scheduler.start();
}public class MyJob implements Job {Overridepublic void execute(JobExecutionContext jobExecutionContext){System.out.println(todo something);}
}
通过以上内容学习了什么是任务调度任务调度所解决的问题以及任务调度的多种实现方式
什么是分布式任务调度 通常任务调度的程序是集成在应用中的比如优惠卷服务中包括了定时发放优惠卷的的调度程序结算服务中包括了定期生成报表的任务调度程序由于采用分布式架构一个服务往往会部署多个冗余实例来运行我们的业务在这种分布式系统环境下运行任务调度我们称之为分布式任务调度如下图 分布式调度要实现的目标
不管是任务调度程序集成在应用程序中还是单独构建的任务调度系统如果采用分布式调度任务的方式就相当于将任务调度程序分布式构建这样就可以具有分布式系统的特点并且提高任务的调度处理能力
1.并行任务调度
并行任务调度实现靠多线程如果有大量任务需要调度此时光靠多线程就会有瓶颈了因为一台计算机CPU的处理能力是有限的
如果将任务调度程序分布式部署每个结点还可以部署为集群这样就可以让多台计算机共同去完成任务调度我们可以将任务分割为若干个分片由不同的实例并行执行来提高任务调度的处理效率。
2、高可用
若某一个实例宕机不影响其他实例来执行任务。
3、弹性扩容
当集群中增加实例就可以提高并执行任务的处理效率。
4、任务管理与监测
对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况从而做出快速的应急处理响应。
5、避免任务重复执行
当任务调度以集群方式部署同一个任务调度可能会执行多次比如在上面提到的电商系统中到点发优惠券的例子就会发放多次优惠券对公司造成很多损失所以我们需要控制相同的任务在多个运行实例上只执行一次。
了解XXL-JOB分布式任务调度平台
XXL-JOB是一个 轻量级分布式任务调度平台专门解决分布式系统中的定时任务调度问题其核心设计目标是开发迅速、学习简单、轻量级、易扩展
官网https://www.xuxueli.com/xxl-job/
XXL-JOB如图所示主要有调度中心执行器任务
1.调度中心XXL-JOB Admin:
调度中心是XXL-JOB的核心管理平台负责对任务进行统一的管理和调度它提供了一个可视化的Web界面方便开发者进行任务的配置监控和管理
2.执行器XXL-JOB Executor
执行器是实际执行任务的组件它负责接收调度中心发送的任务请求并执行具体的业务逻辑执行器可以部署在多个节点上实现分布式任务执行
3.任务
负责执行具体的业务逻辑 调度中心与执行器之间的工作流程如下 执行流程 1.任务执行器根据配置的调度中心的地址自动注册到调度中心 2.达到任务触发条件调度中心下发任务 3.执行器基于线程池执行任务并将执行结果放到内存队列中把执行日志写入日志文件中 4.执行器消费内存队列中的执行结果主动上报给调度中心 5.当用户在调度中心查看任务日志调度中心请求任务执行器任务执行器读取任务日志文件并返回日志详情 如何搭建XXL-JOB
首先需要下载XXL-JOB可以从GitHub地址或者Gitee地址进行下载
GitHub 地址 仓库地址GitHub - xuxueli/xxl-job: A distributed task scheduling framework.分布式任务调度平台XXL-JOB
Gitee 地址 仓库地址xxl-job: 一个分布式任务调度平台其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线开箱即用。
如何集成XXL-JOB我在我的媒资管理模块项目中进行演示
1.当下载好后用IDEA打开目录显示界面如下 其中的 xxl-job-admin为调度中心xxl-job-core为公共依赖xxl-job-executor-samples为执行器推荐使用Springboot版本通过Springboot管理执行器
2.再创建一个命名为xxl_job_2.3.1的数据库
CREATE DATABASE xxl_job_2.3.1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 根据数据库脚本创建数据库修改数据库连接信息和端口启动xxl-job-admin访问http://local:18088/xxl-job-admin/分布式任务调度平台 — 管理和调度分布式环境中的定时任务
使用用户名admin / 密码123456 登录
下面配置执行器执行器负责与调度中心通信接收调度中心发起的任务调度请求
1.进入调度中心添加执行器 启动成功之后可以选择在Linux上运行
使用maven命令将xxl-job-admin打包然后将其上传至Linux中使用命令启动
nohup java -jar /绝对路径/xxl-job-admin-2.3.1.jar
添加完执行器后接着配置执行器执行器负责与调度中心通信接收调度中心发起的任务调度请求
1.首先在media-service工程中添加依赖父工程中完成了版本控制这里的版本是2.3.1
dependencygroupIdcom.xuxueli/groupIdartifactIdxxl-job-core/artifactId
/dependency
2.在nacos下的media-service-dev.yaml下配置xxl-job
注意这里配置的appname是执行器的应用名稍后会在调度中心配置执行器的时候使用
xxl:job:admin:addresses: http://192.168.101.128:18088/xxl-job-admin/executor:appname: media-process-serviceaddress:ip:port: 9999logpath: /data/applogs/xxl-job-jobhandlerlogretentiondays: 30accessToken: default_token
3.配置xxl-job的执行器
将xxl-job-executor-sample-springboot示例工程下的配置类拷贝到媒资管理的service工程下 该类中的属性就是获取配置文件中的配置得到的同时提供了一个执行器的Bean用于初始化XXL-JOB执行器的核心组件XxIJobSpringExecutor
并将其注册为Spring Bean使得执行器能够连接到XXL-JOB管理平台并接收任务调度请求
Configuration
public class XxlJobConfig {private Logger logger LoggerFactory.getLogger(XxlJobConfig.class);Value(${xxl.job.admin.addresses})private String adminAddresses;Value(${xxl.job.accessToken})private String accessToken;Value(${xxl.job.executor.appname})private String appname;Value(${xxl.job.executor.address})private String address;Value(${xxl.job.executor.ip})private String ip;Value(${xxl.job.executor.port})private int port;Value(${xxl.job.executor.logpath})private String logPath;Value(${xxl.job.executor.logretentiondays})private int logRetentionDays;Beanpublic XxlJobSpringExecutor xxlJobExecutor() {logger.info( xxl-job config init.);XxlJobSpringExecutor xxlJobSpringExecutor new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setAddress(address);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}/*** 针对多网卡、容器内部署等情况可借助 spring-cloud-commons 提供的 InetUtils 组件灵活定制注册IP** 1、引入依赖* dependency* groupIdorg.springframework.cloud/groupId* artifactIdspring-cloud-commons/artifactId* version${version}/version* /dependency** 2、配置文件或者容器启动变量* spring.cloud.inetutils.preferred-networks: xxx.xxx.xxx.** 3、获取IP* String ip_ inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();*/}
再次进入调度中心添加执行器 重启媒资管理服务模块就可以看到执行器在调度中心注册成功 下面我们编写任务演示如何使用在media-service下新建包com.project.media.service.jobhandler,在该包下定义我们的任务类
package com.xuecheng.media.service.jobhandler;import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;/*** description 测试执行器* author Mr.M* date 2022/9/13 20:32* version 1.0*/ComponentSlf4j
public class SampleJob {/*** 1、简单任务示例Bean模式*/XxlJob(testJob)public void testJob() throws Exception {log.info(开始执行.....);}}
然后进入调度中心添加任务进入任务管理新增任务信息 调度类型固定速度指按固定的间隔定时调度
Cron通过Cron表达式实现更丰富的定时调度策略它的表达式是一个字符串通过它可以定义调度策略格式如下
{秒数}{分数}{小时}{日期}{月份}{星期}{年份可为空} 比如
30 10 1**表示每天1点10分30秒触发
0/30**** 每30秒触发一次
* 0/10***每10分钟触发一次
添加成功启动任务 下面启动媒资管理的service工程启动执行器并观察执行器方法的执行 掌握了xxL-Job的基本使用继续思考如何进行分布式任务处理比如说我们会启动多个执行器组成一个集群去执行任务 结合以上XXL-JOB的实现我们可以利用 分片广播策略 来提高处理效率尤其是处理数据库中大量数据比如项目中媒资管理模块需要处理大量视频文件
分片广播
分片广播是分布式任务调度中一种常见模式主要用于将一个大任务拆分成多个子任务分片并将这些子任务 并发分发 到多个执行器节点上执行从而提高任务处理效率 以上图示是 调度中心以执行器为维度进行分片将集群中的执行器标上序号0123....,广播是指每次调度会向集群中的所有执行器发送任务调度请求中携带分片参数每个执行器收到调度请求同时接收分片参数
像这种分片广播适用于哪些场景
分片任务场景10个执行器的集群来处理10w条数据数据之多每台机器只需要处理1w条数据分片执行耗时降低10倍;
广播任务场景广播执行器同时运行shell脚本广播集群节点进行缓存更新等 分片广播 和普通任务开发流程一致不同之处在于可以获取分片参数进行分片业务处理。 测试分片广播策略
1.定义作业分片的任务方法
/***分片广播任务*/XxlJob(shardingJobHandler)public void shardingJobHandler() throws Exception{//分片参数int shardIndex XxlJobHelper.getShardIndex();int shardTotal XxlJobHelper.getShardTotal();Log.info(分片参数当前分片序号 {}总分片数 {}shardIndexshardTotal);
}
2.在调度中心添加任务 回到任务调度界面可以看到该项任务添加成功
3.启动任务观察日志 下面需要启动两个执行器实例观察每个实例的执行情况
1.首先在nacos中配置media-service的本地优先部署
#配置本地优先
spring:cloud:config:override-none: true
2.将media-service启动两个实例两个实例在启动时端口不能冲突
例如在VM options处添加-Dserver.port63051 - Dxxl.job.executor.port9998
在VM options处添加 -Dserver.port63050 - Dxxl.job.executor.port9999
3.启动两个实例观察任务调度中心稍等片刻执行器会有两个 分别观察这两个执行实例的日志
日志一 日志二 从日志可以看到每个实例的分片序号不同如果其中一个执行器挂掉只剩下一个执行器在工作稍等片刻调用中心发现少了一个执行器将动态调整总分片数为1
作业分片方案
以上任务添加成功后对于要处理的任务会添加到待处理任务表中现在启动多个执行器实例去查询这些待处理任务如何保证多个执行器不会查询到重复的任务呢
XXL-JOB并不直接提供数据处理的功能它只会给执行器分配好分片序号在向执行器任务调度的同时下发分片总数以及分片序号等这些参数执行器收到这些参数后根据自己的业务需求去利用这些参数
下图表示了多个执行器获取视频处理任务的结构 每个执行器收到广播任务会有两个参数分片总数分片序号
每次执行从数据表取任务时可以让任务id 模上取模运算 分片总数如果等于分片 序号则能执行此任务
假设我们有6个待处理的视频任务任务ID依次为1-6同时有3个执行器实例那么分片总数就是3对应的分片序号则为012。具体任务分配情况如下
任务序号任务 ID 分片总数求模运算应执行的执行器分片序号11 % 3 1执行器 222 % 3 2执行器 333 % 3 0执行器 144 % 3 1执行器 255 % 3 2执行器 366 % 3 0执行器 1
从上述表格中可以清晰地看到每个任务都根据其任务ID的取模结果被精准地分配到了对应的执行器上而不会出现多个执行器获取到同一个任务的情况
通过这种XXL-JOB的分片机制可以用于处理视频转码视频审核视频分发等任务将大量视频处理任务均匀分配给多个执行器保证任务的高效执行和不会重复处理
文章转载自: http://www.morning.rqqn.cn.gov.cn.rqqn.cn http://www.morning.nzkkh.cn.gov.cn.nzkkh.cn http://www.morning.txmkx.cn.gov.cn.txmkx.cn http://www.morning.lmfxq.cn.gov.cn.lmfxq.cn http://www.morning.tgmfg.cn.gov.cn.tgmfg.cn http://www.morning.dpplr.cn.gov.cn.dpplr.cn http://www.morning.jcxzq.cn.gov.cn.jcxzq.cn http://www.morning.wsjnr.cn.gov.cn.wsjnr.cn http://www.morning.slkqd.cn.gov.cn.slkqd.cn http://www.morning.phgz.cn.gov.cn.phgz.cn http://www.morning.wsyst.cn.gov.cn.wsyst.cn http://www.morning.kgqww.cn.gov.cn.kgqww.cn http://www.morning.blbys.cn.gov.cn.blbys.cn http://www.morning.zgpgl.cn.gov.cn.zgpgl.cn http://www.morning.ltqzq.cn.gov.cn.ltqzq.cn http://www.morning.smpb.cn.gov.cn.smpb.cn http://www.morning.pbdnj.cn.gov.cn.pbdnj.cn http://www.morning.rwzqn.cn.gov.cn.rwzqn.cn http://www.morning.zhoer.com.gov.cn.zhoer.com http://www.morning.mtgnd.cn.gov.cn.mtgnd.cn http://www.morning.tstwx.cn.gov.cn.tstwx.cn http://www.morning.rpgdd.cn.gov.cn.rpgdd.cn http://www.morning.iuibhkd.cn.gov.cn.iuibhkd.cn http://www.morning.thlzt.cn.gov.cn.thlzt.cn http://www.morning.nrcbx.cn.gov.cn.nrcbx.cn http://www.morning.4q9h.cn.gov.cn.4q9h.cn http://www.morning.sjsks.cn.gov.cn.sjsks.cn http://www.morning.wmmqf.cn.gov.cn.wmmqf.cn http://www.morning.sjwzl.cn.gov.cn.sjwzl.cn http://www.morning.hrnrx.cn.gov.cn.hrnrx.cn http://www.morning.zgztn.cn.gov.cn.zgztn.cn http://www.morning.hilmwmu.cn.gov.cn.hilmwmu.cn http://www.morning.skdhm.cn.gov.cn.skdhm.cn http://www.morning.mbhdl.cn.gov.cn.mbhdl.cn http://www.morning.jmtrq.cn.gov.cn.jmtrq.cn http://www.morning.qkxnw.cn.gov.cn.qkxnw.cn http://www.morning.yrjkp.cn.gov.cn.yrjkp.cn http://www.morning.jrsgs.cn.gov.cn.jrsgs.cn http://www.morning.ztqyj.cn.gov.cn.ztqyj.cn http://www.morning.sxlrg.cn.gov.cn.sxlrg.cn http://www.morning.wmlby.cn.gov.cn.wmlby.cn http://www.morning.tnwgc.cn.gov.cn.tnwgc.cn http://www.morning.wqngt.cn.gov.cn.wqngt.cn http://www.morning.mkczm.cn.gov.cn.mkczm.cn http://www.morning.xbmwh.cn.gov.cn.xbmwh.cn http://www.morning.xbnkm.cn.gov.cn.xbnkm.cn http://www.morning.gmplp.cn.gov.cn.gmplp.cn http://www.morning.kfcfq.cn.gov.cn.kfcfq.cn http://www.morning.hwbmn.cn.gov.cn.hwbmn.cn http://www.morning.xkwyk.cn.gov.cn.xkwyk.cn http://www.morning.gsjzs.cn.gov.cn.gsjzs.cn http://www.morning.jsxrm.cn.gov.cn.jsxrm.cn http://www.morning.srgwr.cn.gov.cn.srgwr.cn http://www.morning.zrfwz.cn.gov.cn.zrfwz.cn http://www.morning.wjxyg.cn.gov.cn.wjxyg.cn http://www.morning.wmdlp.cn.gov.cn.wmdlp.cn http://www.morning.jmnfh.cn.gov.cn.jmnfh.cn http://www.morning.ghxzd.cn.gov.cn.ghxzd.cn http://www.morning.chxsn.cn.gov.cn.chxsn.cn http://www.morning.jlqn.cn.gov.cn.jlqn.cn http://www.morning.lktjj.cn.gov.cn.lktjj.cn http://www.morning.rnqrl.cn.gov.cn.rnqrl.cn http://www.morning.jqbmj.cn.gov.cn.jqbmj.cn http://www.morning.jfbpf.cn.gov.cn.jfbpf.cn http://www.morning.symgk.cn.gov.cn.symgk.cn http://www.morning.yxwnn.cn.gov.cn.yxwnn.cn http://www.morning.hytr.cn.gov.cn.hytr.cn http://www.morning.yzxhk.cn.gov.cn.yzxhk.cn http://www.morning.cxsdl.cn.gov.cn.cxsdl.cn http://www.morning.fllx.cn.gov.cn.fllx.cn http://www.morning.gqtzb.cn.gov.cn.gqtzb.cn http://www.morning.hlxxl.cn.gov.cn.hlxxl.cn http://www.morning.lysrt.cn.gov.cn.lysrt.cn http://www.morning.pmptm.cn.gov.cn.pmptm.cn http://www.morning.mbpzw.cn.gov.cn.mbpzw.cn http://www.morning.mnkz.cn.gov.cn.mnkz.cn http://www.morning.clccg.cn.gov.cn.clccg.cn http://www.morning.kncrc.cn.gov.cn.kncrc.cn http://www.morning.dkqyg.cn.gov.cn.dkqyg.cn http://www.morning.trjdr.cn.gov.cn.trjdr.cn