首页 > 数据库 > 数据库开发技术 > 分布式任务调度、线程池使用、视频转换
1 分布式任务调度
在项目开发中我们想要提升我们项目响应的速度或者想要服务器高效处理一批任务,这个时候就有两种方式:
多线程:充分利用单机资源
分布式+多线程:充分利用多台机器,并且每台计算机使用多线程处理
方案2可扩展性更强,并且方案2是一种分布式任务调度的处理方案。
1.1 概念
我们可以先思考一下下面业务场景的解决方案:
某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。
某财务系统需要在每天上午10点前结算前一天的账单数据,统计汇总。
某电商平台每天凌晨3点,要对订单中的无效订单进行清理。
12306网站会根据车次不同,设置几个时间点分批次放票。
商品成功发货后,需要向客户发送短信提醒。
类似的场景还有很多,我们该如何实现?
以上这些场景,就是任务调度所需要解决的问题。
任务调度顾名思义,就是对任务的调度,它是指系统为了完成特定业务,基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。
通常任务调度的程序是集成在应用中的,比如:优惠卷服务中包括了定时发放优惠卷的的调度程序,结算服务中包括了定期生成报表的任务调度程序,
由于采用分布式架构,一个服务往往会部署多个冗余实例来运行我们的业务,在这种分布式系统环境下运行任务调度,我们称之为分布式任务调度,如下图:
分布式调度要实现目标:
并行任务调度
高可用
弹性扩容
任务管理与监测
避免任务重复执行
1.2 实现方式
①多线程
开启一个线程,每sleep一段时间,就去检查是否已到预期执行时间。
②Timer、ScheduledExecutor
Jdk也为我们提供了相关支持,如Timer、ScheduledExecutor.
Timer
Timer 的优点在于简单易用,每个Timer对应一个线程,因此可以同时启动多个Timer并行执行多个任务,同一个Timer中的任务是串行执行。
③第三方框(Quartz、XXL-Job)
XXL-JOB
XXL-JOB主要有调度中心、执行器、任务
XXL-JOB快速入门
XXL-JOB执行流程:
拓展:分片广播策略
掌握了xxl-job的基本使用,下边思考如何进行分布式任务处理呢?如下图,我们会启动多个执行器组成一个集群,去执行任务。
分片是指是调度中心将集群中的执行器标上序号:0,1,2,3…,广播是指每次调度会向集群中所有执行器发送调度请求,请求中携带分片参数。
分片广播:执行器并行处理数据,并且不重复,压力均衡分散到每个执行器
1
作业分片适用哪些场景呢?
• 分片任务场景:10个执行器的集群来处理10w条数据,每台机器只需要处理1w条数据,耗时降低10倍;
• 广播任务场景:广播执行器同时运行shell脚本、广播集群节点进行缓存更新等。
所以,广播分片方式不仅可以充分发挥每个执行器的能力,并且根据分片参数可以控制任务是否执行,最终灵活控制了执行器集群分布式处理任务。
2 视频转换及线程池使用
2.1 视频编码
文件格式:是指.mp4、.avi、.rmvb等 这些不同扩展名的视频文件的文件格式 ,视频文件的内容主要包括视频和音频,其文件格式是按照一 定的编码格式去编码,并且按照该文件所规定的封装格式将视频、音频、字幕等信息封装在一起,播放器会根据它们的封装格式去提取出编码,然后由播放器解码,最终播放音视频。
音视频编码格式:通过音视频的压缩技术,将视频格式转换成另一种视频格式,通过视频编码实现流媒体的传输。比如:一个.avi的视频文件原来的编码是a,通过编码后编码格式变为b,音频原来为c,通过编码后变为d。
常见的音视频编码格式:MPEG系列、H.26X系列
2.2 FFmpeg介绍与使用
FFmpeg被许多开源项目采用,QQ影音、暴风影音、VLC等。
下载:FFmpeg https://www.ffmpeg.org/download.html#build-windows
基本命令使用范例:将一个.avi文件转成mp4、mp3、gif等。
比如我们将nacos.avi文件转成mp4,运行如下命令:
ffmpeg -i nacos.avi nacos.mp4
转成mp3:ffmpeg -i nacos.avi nacos.mp3
转成gif:ffmpeg -i nacos.avi nacos.gif
2.3 分布式处理视频
①导入依赖
③编写视频处理任务VideoTask【线程池】
拓展:不建议使用Executors
阿里巴巴开发手册中明确表示不建议使用Executor来创建线程
Executors.newCachedThreadPool()
最大线程数是Integer.MAX_VALUE,任务队列是SynchronousQueue,对任务来者不拒,创建线程是一个很耗性能的事,创建过多线程易导致OOM
Executors.newFixedThreadPool(1)
这个线程池倒是没有上个线程池豪横了, 它定死了线程数量, 所以线程数量是不会超出的,但是它的任务队列是无界的LinkedBlockingQueue, 对于加进来的任务处理不过来就会存入任务队列中, 并且无限制的存入队列。 这个线程池感觉就是家里有地, 无论来多少货都往里面装。【这个线程池如果使用不当很容易导致OOM】
Executors.newSingleThreadExecutor()
这个线程池只有一个线程, 比newFixedThreadPool还穷, 但是任务队列和上面一样, 没有限制, 很容易就使用不当导致OOM
Executors.newScheduledThreadPool(2)
这个是定时任务的线程池, 没有定义线程创建数量的上线, 同时任务队列也没有定义上限, 如果前一次定时任务还没有完成, 后一个定时任务的运行时间到了, 它也会运行, 线程不够就创建。 这样如果定时任务运行的时间过长, 就会导致前后两个定时任务同时执行,如果他们之间有锁,还有可能出现死锁, 此时灾难就发生了。
原文作者:acgchan;如有侵权,请联系管理员删除。