在线教育项目话术(1W字精选)

 产品结构图

Nginx实现代理

问:我们在本机的host文件中配置了域名映射,都是同一个服务器。我们只需要输入对应的域名就可以到对应的界面,这是怎么实现的? 

答:主要就是通过Nginx反向代理来实现的,Nginx会先通过域名去匹配对应的端口(主要就是通过配置监听端口),再通过配置的服务器地址找到服务器,最终访问服务器对应的端口。

一个server就是一个虚拟主机。并且每个虚拟主机都是在监听80端口(在没有输入端口的时候就默认就是走80端口)。通过server_name也就是域名做匹配,最终进行代理。 

项目编写时出现的小问题

1.在对Long类型的数据进行比较的时候,如果数值在-128~127时,则可以使用==判断是否相同。在源码中使用-128~127的缓存数组,在该区间的Long数据都是相同的,而不在该区间时则是通过new来创建的,不能使用==来判断是否相等。(所以在判断Long数值的相同时使用equal)

2.返回类型后存储类型为枚举的时候的存储方式。

 @JsonValue //在使用枚举类型的数据进行返回时,我们可能只是需要枚举中的某个属性,此时在枚举中被@JsonVlaue修饰的属性就会作为返回类型(用于返回前端时,需要配合jackJson使用)
    @EnumValue //当枚举类型的数据存储数据库的时候,此时在枚举中被@EnumValue修饰的属性就会作为存储类型(用于数据库的存储,需要配合mybatis使用)
  • @JsonValue:在使用枚举类型的数据进行返回时,我们可能只是需要枚举中的某个属性,此时在枚举中被@JsonVlaue修饰的属性就会作为返回类型(用于返回前端时,需要配合jackJson使用)
  •  @EnumValue://当枚举类型的数据存储数据库的时候,此时在枚举中被@EnumValue修饰的属性就会作为存储类型(用于数据库的存储,需要配合mybatis使用)

3.在个人课表中的幂等性的处理方式:通过对用户id和课程的id做联合索引,并且将该索引设置为唯一索引,这样就可以保证在做课程加入的时候,一个用户只能有一个对应的课程,最终解决幂等性问题。

4.在项目中,每次进入个人空间及需要userId的地方是如何获取userId的?

在项目中我们主要是通过token来进行校验的,我们会做一个全局拦截器去解析该token(通过JWT),最终获取到userId,为了能够传递下去(不局限于当前方法),我们可以将userId存储到ThreadLocal中,最终后续的方法都可以获取到UserId。

视频观看模块(合并写请求)

问:在你开发中有没有比较有挑战性的模块呢?

答:有一个辅助功能我印象比较深刻,视频的播放位置的处理,我们的规则就是续播位置的误差需要控制在30秒内,并且切换设备也需要有这个续播功能,本质上就是观看的位置储存到服务端数据库的一系列操作,因为播放视频为用户的主要操作,所以需要考虑高并发的优化。.....那我给您介绍一下这个优化方案。.....

提交信息记录的优化方案(高并发优化方案)

未优化前:

提交的记录分为两种类型:考试和视频。

考试的话,我们就直接新增记录即可并将修改课表的已学章节数 + 1(因为规则就是只能考试一次)。

视频的话,前端每个15秒就会提交一次,主要就是记录当前的观看位置,去不断地修改记录的观看位置,看完的规则就是大于50%,我们通过前端传来的观看位置和视频总时间进行判断,最终修改课表数据中的已学章节数 + 1(只有第一次看完会修改课表数据)。

我们需要判断是否存在记录,以及每次提交都需要修改记录的观看位置,涉及到大量的数据库操作,接口会就一直处于高并发的场景。

优化后:

高并发的优化方案,可以从集群数量,服务的熔断,限流,及减少DB操作进行优化。

使用redis缓存+rabbitMq来进行优化(缓存 + 异步任务+线程池)。

使用redis的hash结构来存储临时观看位置,大key储存lessonId,小key储存节的id,value储存amount及看完标识。

在判断是否存在记录的时候,先去缓存中查询是否存在,然后再去DB中查询并添加缓存。(用缓存查询解决判断) 

为了防止多次的操作数据库,修改观看位置时,先将储存到redis中的观看位置进行修改,使用延迟队列发送延迟20秒的消息(数据主要就是观看的位置),在每次监听到消息的时候。判断消息的观看位置和缓存中的是否相同(lessonId + 节id来确定缓存中观看位置数据),如果相同(说明用户当前20秒内没有观看)则去更新数据库并清除缓存。如果不相同(说明用户还在观看)则不进行操作。

在后续执行操作db的时候,为了提高速度,我们还使用了线程池(使用submit方法进行提交任务),在监听方法中监听到任务后使用多线程执行任务,我们会创建一个静态的线程池,实现多线程操作数据库,加快db的操作,减少io的消耗时间。因为涉及到的io操作比较多,所以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值