一、分布式任务调度
任务调度顾名思义,就是对任务的调度,它是指系统为了完成特定业务,基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。
一个服务往往会部署多个冗余实例来运行我们的业务,在这种分布式系统环境下运行任务调度,我们称之为分布式任务调度
分布式调度要实现的目标:
1、并行任务调度
并行任务调度实现靠多线程,如果有大量任务需要调度,此时光靠多线程就会有瓶颈了,因为一台计算机CPU的处理能力是有限的。
如果将任务调度程序分布式部署,每个结点还可以部署为集群,这样就可以让多台计算机共同去完成任务调度,我们可以将任务分割为若干个分片,由不同的实例并行执行,来提高任务调度的处理效率。
2、高可用
若某一个实例宕机,不影响其他实例来执行任务。
3、弹性扩容
当集群中增加实例就可以提高并执行任务的处理效率。
4、任务管理与监测
对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况,从而做出快速的应急处理响应。
5、避免任务重复执行
当任务调度以集群方式部署,同一个任务调度可能会执行多次,比如在上面提到的电商系统中到点发优惠券的例子,就会发放多次优惠券,对公司造成很多损失,所以我们需要控制相同的任务在多个运行实例上只执行一次。
二、数据库索引
什么是索引?
索引是数据库表中的字段的索引,所谓的索引就是在表的字段上添加的,每个字段都可以添加索引来提高查找效率,也可以多个字段联合添加一个索引。
参考字典的实现,索引相当于字典的目录,通过目录缩小查找范围。
索引的实现原理
假设有一张用户表:t_user
id(PK) name 每一行记录在硬盘上都有物理存储编号
----------------------------------------------------------------------------------
100 zhangsan 0x1111
120 lisi 0x2222
99 wangwu 0x8888
88 zhaoliu 0x9999
101 jack 0x6666
55 lucy 0x5555
130 tom 0x7777
不管索引存储在哪里,索引在mysql当中都是一个树的形式存在。(自平衡二叉树:B-Tree)
假如sql语句是:select * from t_user where id = 101;
条件是id = 101,mysql发现id字段上有索引对象,所以会通过索引对象进行查找:
101比100大,看右边
101比120小,看左边
定位到101,通过定位到的101得出对应的物理编号0x6666,就会转换sql语句成:
select * from t_user where 物理编号 = 0x6666;
直接通过物理编号0x6666定位到存储的记录
101 jack 0x6666,
返回给用户。
假如id字段没有索引的话,他会到id字段上,进行从上到下查找,直至找到101,效率很低。
索引的类型
分单列索引、组合索引和全文索引
单列索引:
- 主键索引,数据库表的主键字段会自动创建索引。
- 唯一索引,当某个列添加了Unique约束,也会自动创建唯一索引,要求值必须是唯一的。
- 普通索引,给普通字段添加索引就是普通索引。
组合索引:
多个字段合起来创建一个索引,只有当查询条件中使用了组合索引的第一个字段,索引才会被使用,使用组合索引是遵循最左前缀原则。
CREATE INDEX index_id_name ON mytable(id,name);
三、.avi视频处理流程
- 任务调度:xxljob调度中心通过定时调度,开启服务层的任务,此处配置阻塞策略为丢弃后续进度,配置调度过期策略为忽略
- 服务层访问数据库,得到需要处理的任务的列表,并开启线程池(大小与任务数相同)和计数器,随后多线程处理,每个线程的任务为:从任务属性中获取文件路径,根据路径从Minio中下载文件,后利用工具类转码,将转码后的文件上传到Minio,最后修改媒资表、媒资任务表和媒资任务历史表的内容(status,url等)
四、ExecutorService
ExecutorService是Java提供的线程池,也就是说,每次我们需要使用线程的时候,可以通过ExecutorService获得线程。它可以有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞,同时提供定时执行、定期执行、单线程、并发数控制等功能
固定线程数线程池(暂时先认识这个)
Executors.newFixedThreadPool(3);
五、CountDownLatch
原文章:CountDownLatch_半桶水的码农的博客-CSDN博客
CountDownLatch的作用很简单,就是一个或者一组线程在开始执行操作之前,必须要等到其他线程执行完才可以。我们举一个例子来说明,在考试的时候,老师必须要等到所有人交了试卷才可以走。此时老师就相当于等待线程,而学生就好比是执行的线程。
我们使用学生考试的案例来进行演示:
在上面,我们定义了一个CountDownLatch,并设置其值为2。有两个学生使用两个线程来表示,然后依次执行。最后老师线程(main线程)在学生线程都执行完了才可以执行。我们来运行一边看看结果。
现在我们应该能体会到其用法了吧。在上面我们的等待线程时老师(main线程)。