学成在线:第五天(p82-p93)

news/2024/11/17 23:51:19/

1、面试:在分片广播中,如何保证多个执行器不会重复执行任务?

(虽然有分片序号,但是加入只有两个执行器,有很多任务,这两个执行器得到的分片序号也就只是两个数字,后面的分片是如何能够通过这两个数字分发给不同的任务执行器的?)

每个执行从数据表取任务时可以让任务 id 模上 分片总数,如果等于分片序号则执行此任务。
上边两个执行器实例那么分片总数为 2,序号为 0、1,从任务 1 开始,如下:
1 % 2 = 1 执行器 2 执行
2 % 2 = 0 执行器 1 执行
3 % 2 = 1 执行器 2 执行
以此类推

2、面试:如果同一个执行器在处理一个视频还没有完成,此时调度中心又一次请求调度,为了不重复处理同一个视频该怎么办?

首先配置【调度过期策略】:
①忽略:调度过期后,忽略过期的任务,从当前时间开始重新计算下次触发时间;
②立即执行一次:调度过期后,立即执行一次,并从当前时间开始重新计算下次触发时间;
再看【阻塞处理策略】:
阻塞处理策略就是当前执行器正在执行任务还没有结束时调度时间到达到,此时该如何处理。
①单机串行(默认):调度请求进入单机执行器后,调度请求进入 FIFO 队列并以串行方式运行;
②丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;
③覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务;
这里说的方法在网络环境下不能绝对地保证任务不重复执行,所以需要后面介绍的锁来控制

3、面试:什么是任务的幂等性?

任务的幂等性是指:对于数据的操作不论多少次,操作的结果始终是一致的。
它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果。
幂等性是为了解决重复提交问题,比如:恶意刷单,重复支付等。
【项目中的应用】这里我们在数据库视频处理表中添加处理状态字段,视频处理完成更新状态为完成,执行视频处理前判断状态是否完成,如果完成则不再处理。

4、乐观锁?悲观锁

乐观锁和悲观锁的最终目的都是为了保证线程安全,避免在并发场景下的资源竞争问题
项目中的应用:就是当前的表中添加了一个字段version(版本号机制)
悲观锁:
悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。比如Java中的synchronized
即,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程
悲观锁通常多用于写多比较多的情况下(多写场景),避免频繁失败和重试影响性能。
乐观锁:
乐观锁总是假设最好的情况,认为共享资源每次被访问的时候不会出现问题,线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源(也就是数据)是否被其它线程修改了(具体方法可以使用版本号机制或 CAS 算法)
乐观锁通常多于写比较少的情况下(多读场景),避免频繁加锁影响性能,大大提升了系统的吞吐量。
版本号机制:
一般是在数据表中加上一个数据版本号 version 字段,表示数据被修改的次数。当数据被修改时,version 值会加一。当线程 A 要更新数据值时,在读取数据的同时也会读取 version 值,在提交更新时,若刚才读取到的 version 值为当前数据库中的 version 值相等时才更新,否则重试更新操作,直到更新成功。(提交版本必须等于当前版本才能执行更新)
CAS算法:
CAS 的全称是 Compare And Swap(比较与交换) ,就是用一个预期值和要更新的变量值进行比较,两值相等才会进行更新。
CAS 是一个原子操作,底层依赖于一条 CPU 的原子指令。——原子操作:最小不可拆分的操作,也就是说操作一旦开始,就不能被打断,直到操作完成。
CAS 涉及到三个操作数:
V :要更新的变量值(Var)
E :预期值(Expected)
N :拟写入的新值(New)
当且仅当 V 的值等于 E 时,CAS 通过原子方式用新值 N 来更新 V 的值。如果不等,说明已经有其它线程更新了V,则当前线程放弃更新
比如说:线程 A 要修改变量 i 的值为 6,i 原值为 1(V = 1,E=1,N=6)
乐观锁存在的ABA问题:
如果一个变量 V 初次读取的时候是 A 值,并且在准备赋值的时候检查到它仍然是 A 值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间它的值可能被改为其他值,然后又改回 A,那 CAS 操作就会误认为它从来没有被修改过。这个问题被称为 CAS 操作的 "ABA"问题。
ABA 问题的解决思路是在变量前面追加上版本号或者时间戳。

5、139页mediaProcessMapper.update方法的参数是啥,和updateById区别

update包含两个参数:第一个是包含了更新数据的实体对象entity,第二个是包含了查询条件的实体对象封装操作类UpdateWrapper
在这里插入图片描述
update更新传回数据的所有字段,没有传回的字段保持原样。
updateByPrimaryKey对实体类的字段全部更新(不判断是否为Null),即如果字段为空就更新为空
【补充】updateByPrimaryKeySelective会对实体类字段进行判断再更新(如果为Null就忽略更新),如果字段为空,忽略不更新;

6、面试:xxl-job 的工作原理是什么?xxl-job 是什么怎么工作?

XXL-JOB :分布式任务调度服务,由调用中心和执行器组成,调用中心负责按任务调度策略向执行器下发任务,执行器负责接收任务执行任务。
1)首先部署并启动 xxl-job 调度中心。(一个 java 工程)
2)首先在微服务添加 xxl-job 依赖,在微服务中配置执行器
3)启动微服务,执行器向调度中心上报自己。
4)在微服务中写一个任务方法并用 xxl-job 的注解去标记执行任务的方法名称。
5) 在调度中心配置任务调度策略,调度策略就是每隔多长时间执行还是在每天或每月的固定时间去执行,比如每天 0 点执行,或每隔 1 小时执行一次等。
6)在调度中心启动任务。
7)调度中心根据任务调度策略,到达时间就开始下发任务给执行器。
8)执行器收到任务就开始执行任务。

7、面试:如何保证任务不重复执行?

1)调度中心按分片广播的方式去下发任务
2)执行器收到作业分片广播的参数:分片总数和分片序号,计算 “任务 id 除以 分片总数”得到一个余数,如果余数等于分片序号这时就去执行这个任务,这里保证了不同的执行器执行不同的任务。
3)配置调度过期策略为“忽略”,避免同一个执行器多次重复执行同一个任务
4)配置任务阻塞处理策略为“丢弃后续调度”,注意:丢弃也没事,下一次调度就又可以执行了
5)另外还要保证任务处理的幂等性,执行过的任务可以打一个状态标记已完成,下次再调度执行该任务判断该任务已完成就不再执行

8、面试:任务幂等性如何保证?

它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果。
幂等性是为了解决重复提交问题,比如:恶意刷单,重复支付等。
解决幂等性常用的方案:
1)数据库约束,比如:唯一索引,主键。同一个主键不可能两次都插入成功。
2)乐观锁,常用于数据库,更新数据时根据乐观锁状态去更新。
3)唯一序列号,请求前生成唯一的序列号,携带序列号去请求,执行时在 redis 记录该序列号表示以该序列号的请求执行过了,如果相同的序列号再次来执行说明是重复执行。

9、面试:模板引擎

模板引擎其实就是服务器渲染页面的技术,渲染的过程就是向 jsp 页面(模板)内填充数据(模型)。服务器将渲染生成的页面返回给浏览器。
模板引擎就是:模板+数据=输出,jsp 页面就是模板,页面中嵌入的 jsp 标签就是数据,两者相结合输出 html 网页。
常用的 java 模板引擎还有哪些?
Jsp、Freemarker、Thymeleaf 、Velocity 等。
本项目用的是Freemarker
Freemarker: 一种基于模板和要改变的数据, 用来生成输出文本(HTML 网页等)的通用工具。 它不是面向最终用户的,而是一个 Java 类库。

10、ssi on

SSI是英文Server Side Includes的缩写,翻译成中文就是服务器端包含的意思,是一种基于服务端的网页制作技术
SSI具有 强大的功能,只要使用一条简单的SSI命令就可以实现整个网站的内容更新
网站维护常常碰到的一个问题是,网站的结构已经固定,却为了更新一点内容而不得不重做一大批网页。SSI提供了一种简单、有效的方法来解决这一问题。
原理是:将 一个网站的基本结构放在几个简单的HTML文件中(模板),以后我们要做的只是将文本传到服务器,让程序按照模板自动生成网页,从而使管理大型网站变得容易。
需要的选项主要是以下三个:
ssi: 默认值off,启用ssi时将其设为on
ssi_silent_errors: 默认值off,开启后在处理SSI文件出错时不输出错误提示"[an error occurred while processing the directive]"。
ssi_types: 默认是text/html,所以如果需支持html,则不需要设置这句(因为是默认的),如果需要支持其他类型,则需要设置
三个参数可以放在http, server或location作用域下。


http://www.ppmy.cn/news/183660.html

相关文章

MFC OnCtlColor函数参数的控制

MFC类库提供了CWnd::OnCtlColor函数,在工作框架的子窗口被重画时将调用该成员函数.在界面处理的时候很有用处 因此可以重载WM_CTLCOLOR消息的响应函数. 【MSDN】此函数的原型: The framework calls this member function when a child control is about to be drawn afx_ms…

几何分布和负二项分布的关系

几何分布和负二项分布的关系 几何分布 在独立重复Bernoulli试验中,事件A首次发生时所进行的试验次数X服从几何分布 P ( X k ) ( 1 − p ) k − 1 p ( k 1 , 2 ⋯ ) E ( X ) 1 p 、 D ( X ) 1 − p p 2 P(Xk)(1-p)^{k-1}p(k…

老笔记本电脑机械500GB升级固态1T

原电脑只有一个2.5的硬盘位,没有光驱位,只能整个机械的换成固态 原硬盘使用win10系统 材料:西数蓝盘1T(sata),此电脑没有nvme接口,买个sata的亏大发(706大洋外加19的空运运费)… 操作环境&#…

Ubuntu(Linux)新系统分区

本人使用ThinkPad X1 Carboon ,500G硬盘; 安装Ubuntu的系统分区; 挂载点大小用于新分区的类型新分区的位置备注/200GExt4逻辑分区/swap18G交换空间逻辑分区内存大小的1~2倍/boot1GExt4主分区/tem5GExt4逻辑分区/home剩余Ext4逻辑分区/usr70GExt4逻辑分区…

java开发256g固态硬盘_256g固态硬盘有哪些

256GB的SSD固态硬盘是比较主流的一个容量,有很多不同的品牌产品,其中有影驰ONE M.2 256GB,三星970 EVO Plus,威刚SP920 256G,建兴LITEON ZETA系列 256G等产品。接下来详细介绍: 1、影驰ONE M.2采用群联PS50…

为什么500G的移动硬盘实际却只有46…

为什么500G的移动硬盘实际却只有465G 准确的说是 “为什么厂家标明500G的移动硬盘在电脑上显示却只有465G” 原因在于厂家和操作系统的计算方式不一样 厂家的 1GB1000MB1 000 000KB1 000 000 000B 而操作系统的计算方式和教材中一致 1GB1024MB1024 * 1024KB1024 * 1024 * 1024B…

硬盘克隆diskgenius

将笔记本原来500GB的硬盘无缝更换成1TB的硬盘,磁盘克隆步骤如下,使用工具diskgenius: 需要先将1TB的硬盘通过硬盘盒子使用USB3.0接口挂到电脑上,方可执行克隆操作: https://www.diskgenius.cn/help/copydisk.php 拷贝完成后对剩…

500G硬盘分区标准

Linux操作系统安装硬盘分区,500G硬盘分区的规范(不采用LVM): /boot分区 300MB 称为启动分区,主要用于Linux系统启动时加载该分区的Linux内核文件、镜像文件,此分区大小不会增加、是固定的; Swa…