通过高新区网站建设,搜索排名广告营销怎么做,济南网站建设济南,长春市住房建设局网站分布式任务处理
1. 什么是分布式任务调度
视频上传成功需要对视频的格式进行处理#xff0c;如何用Java程序对视频进行处理呢#xff1f;这里有一个关键的需求就是当视频比较多的时候我们如何可以高效处理。
如何去高效处理一批任务呢#xff1f;
1、多线程
多线程是充…分布式任务处理
1. 什么是分布式任务调度
视频上传成功需要对视频的格式进行处理如何用Java程序对视频进行处理呢这里有一个关键的需求就是当视频比较多的时候我们如何可以高效处理。
如何去高效处理一批任务呢
1、多线程
多线程是充分利用单机的资源。
2、分布式加多线程
充分利用多台计算机每台计算机使用多线程处理。
方案2可扩展性更强。
方案2是一种分布式任务调度的处理方案。
什么是分布式任务调度
我们可以先思考一下下面业务场景的解决方案 某电商系统需要在每天上午10点下午3点晚上8点发放一批优惠券。 某财务系统需要在每天上午10点前结算前一天的账单数据统计汇总。 某电商平台每天凌晨3点要对订单中的无效订单进行清理。 12306网站会根据车次不同设置几个时间点分批次放票。 电商整点抢购商品价格某天上午8点整开始优惠。 商品成功发货后需要向客户发送短信提醒。
类似的场景还有很多我们该如何实现
以上这些场景就是任务调度所需要解决的问题。
任务调度顾名思义就是对任务的调度它是指系统为了完成特定业务基于给定时间点给定时间间隔或者给定执行次数自动执行任务。
如何实现任务调度
多线程方式实现
学过多线程的同学可能会想到我们可以开启一个线程每sleep一段时间就去检查是否已到预期执行时间。
以下代码简单实现了任务调度的功能 Javapublic static void main(String[] args) { //任务执行间隔时间 final long timeInterval 1000; Runnable runnable new Runnable() { public void run() { while (true) { //TODOsomething try { Thread.sleep(timeInterval); } catch (InterruptedException e) { e.printStackTrace(); } } } }; Thread thread new Thread(runnable); thread.start(); }
上面的代码实现了按一定的间隔时间执行任务调度的功能。
Jdk也为我们提供了相关支持如Timer、ScheduledExecutor下边我们了解下。
Timer方式实现 Javapublic static void main(String[] args){ Timer timer new Timer(); timer.schedule(new TimerTask(){ Override public void run() { //TODOsomething } }, 1000, 2000); //1秒后开始调度每2秒执行一次 } Timer 的优点在于简单易用每个Timer对应一个线程因此可以同时启动多个Timer并行执行多个任务同一个Timer中的任务是串行执行。
ScheduledExecutor方式实现 Javapublic static void main(String [] agrs){ ScheduledExecutorService service Executors.newScheduledThreadPool(10); service.scheduleAtFixedRate( new Runnable() { Override public void run() { //TODOsomething System.out.println(todo something); } }, 1, 2, TimeUnit.SECONDS); } Java 5 推出了基于线程池设计的 ScheduledExecutor其设计思想是每一个被调度的任务都会由线程池中一个线程去执行因此任务是并发执行的相互之间不会受到干扰。 Timer 和 ScheduledExecutor 都仅能提供基于开始时间与重复间隔的任务调度不能胜任更加复杂的调度需求。比如设置每月第一天凌晨1点执行任务、复杂调度任务的管理、任务间传递数据等等。 Quartz 是一个功能强大的任务调度框架它可以满足更多更复杂的调度需求Quartz 设计的核心类包括 Scheduler, Job 以及 Trigger。其中Job 负责定义需要执行的任务Trigger 负责设置调度策略Scheduler 将二者组装在一起并触发任务开始执行。Quartz支持简单的按时间间隔调度、还支持按日历调度方式通过设置CronTrigger表达式包括秒、分、时、日、月、周、年进行任务调度。 第三方Quartz方式实现 Javapublic static void main(String [] agrs) throws SchedulerException { //创建一个Scheduler SchedulerFactory schedulerFactory new StdSchedulerFactory(); Scheduler scheduler schedulerFactory.getScheduler(); //创建JobDetail JobBuilder 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(); //创建触发的SimpleTrigger 简单的间隔调度 /*SimpleTrigger trigger TriggerBuilder.newTrigger() .withIdentity(triggerName,triggerGroupName) .startNow() .withSchedule(SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(2) .repeatForever()) .build();*/ scheduler.scheduleJob(jobDetail,trigger); scheduler.start(); } public class MyJob implements Job { Override public void execute(JobExecutionContext jobExecutionContext){ System.out.println(todo something); } }
通过以上内容我们学习了什么是任务调度任务调度所解决的问题以及任务调度的多种实现方式。
什么是分布式任务调度 通常任务调度的程序是集成在应用中的比如优惠卷服务中包括了定时发放优惠卷的的调度程序结算服务中包括了定期生成报表的任务调度程序由于采用分布式架构一个服务往往会部署多个冗余实例来运行我们的业务在这种分布式系统环境下运行任务调度我们称之为分布式任务调度如下图 分布式调度要实现的目标 不管是任务调度程序集成在应用程序中还是单独构建的任务调度系统如果采用分布式调度任务的方式就相当于将任务调度程序分布式构建这样就可以具有分布式系统的特点并且提高任务的调度处理能力
1、并行任务调度 并行任务调度实现靠多线程如果有大量任务需要调度此时光靠多线程就会有瓶颈了因为一台计算机CPU的处理能力是有限的。 如果将任务调度程序分布式部署每个结点还可以部署为集群这样就可以让多台计算机共同去完成任务调度我们可以将任务分割为若干个分片由不同的实例并行执行来提高任务调度的处理效率。
2、高可用 若某一个实例宕机不影响其他实例来执行任务。
3、弹性扩容 当集群中增加实例就可以提高并执行任务的处理效率。
4、任务管理与监测 对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况从而做出快速的应急处理响应。
5、避免任务重复执行 当任务调度以集群方式部署同一个任务调度可能会执行多次比如在上面提到的电商系统中到点发优惠券的例子就会发放多次优惠券对公司造成很多损失所以我们需要控制相同的任务在多个运行实例上只执行一次。