当前位置:网站首页>面试项目技术栈总结
面试项目技术栈总结
2022-07-03 02:21:00 【f~shuai】
自学了仿B站后端项目,因为是小白,所以记录一下涉及到的技术,以免面试说的时候比较慌乱。
B站规模大且有不同种类的用户群体、流量、以及个性化的功能。技术角度:经典高并发与异步问题、视频流+弹幕定制化功能
1. 业务架构
- 顶层:用户服务,如注册登录、大会员权限、查找感兴趣视频
- 中间层:在线视频流播放、实时弹幕
- 底层:管理后台,如视频上传、数据统计、系统消息推送
2. 技术架构
- SpringBoot + MySql + Mybatis + Maven
- 开发模式:项目采用经典MVC,模式控制层(Controller层)、服务层(Service层)、数据层(Dao层)
3. 部署架构
- 前端:服务转发+负载均衡
- 后端:业务处理+功能实现
- 工具:缓存、队列
4. 相关技术栈
- 选用Mysql数据库,特点是:体积小、速度快、开源
- 持久层框架:Mybatis,特点是:XML形式管理、支持动态SQL
- 热部署:当应用程序正在运行的时候升级软件或修改某一部分代码、配置文件时,无需手动重启应用,即可使修改的部分生效。热部署方式:spring-boot-devtools工具+IDEA配置
- RESTful风格接口设计
5. RESTful风格相关知识点
- 提供了一个设计原则和约束条件。主要适用于客户端和服务器端交互的软件,是基于http协议实现。目的是为了提高系统的可伸缩性,降低应用之间的耦合度,方便框架分布式处理程序。基于这个风格的软件可更加的简单,更有层次,更易于实现缓存的机制。
- 在restful风格中,用户请求的url使用同一个url,而用请求方式:get/post/delete/put等方式对请求的处理方法进行区分。这样可以在前后台分离的开发中让前端开发人员不会对请求的资源地址产生混淆,形成一个统一的接口。
- 在http协议中,四个表示操作方式的动词:GET/POST/PUT/DELETE。
GET:用来获取资源。对应select,是从服务器查询,可以在服务器通过请求的参数区分查询的方式
POST:用来新建立资源,也可以更新资源。对应create,是在服务器上建立一个资源,通过insert操作,没有幂等性。
PUT:用来更新资源。对应update操作,在服务器更新资源,调用update操作
DELETE :用来删除资源,对应DELETE操作,从服务器删除资源,调用delete语句
6. 观察者模式、订阅发布模式的了解
- 观察者模式:观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。
- 订阅发布模式:发布-订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。
- 区别:观察者和主题之间是松耦合的关系,他们之间没有代理人。发布者和订阅者之间是完全解耦的关系,他们彼此不知道对方,完全通过代理人来执行事项。
7. RBAC权限控制模型
- 用户:注册用户;角色:Lv0~Lv6会员,权限:视频投稿、发布动态、各种弹幕功能等等,资源:页面、页面元素,操作:点击、跳转、增删改查等等,这里均使用到了RBAC权限控制模型
- RBAC权限控制模型:是基于角色的权限控制
- RBAC模型的层级为:RBAC0,RBAC1,RBAC2,RBAC3
- 数据库表设计:角色表、用户角色关联表、元素操作权限表、角色元素操作权限关联表、页面菜单权限表、角色页面菜单权限关联表
8. SpringAOP的了解
- SpringAOP是一种面向切面编程的编程思想,是一种约定流程的编程; 有切面,连接点,通知,切点。
- AOP是基于动态代理的技术,在程序运行的时候,动态的修改class字节码生成新的class文件进行运行的技术,可以对某个类的某个方法、多个类的多个方法,通过配置切点表达式进行匹配,然后改造被匹配到的类的某一些方法,然后运行.
- 动态代理有两种,CJLIB的基于子类的动态代理,JDK自带的基于接口的动态代理。 常见的aop使用场景有:日志统一管理,事务管理器。
- 连接点(joinpoint):对应的被拦截的对象;切点(pointcut):通过正则或指示器的规则来适配连接点;切面(aspect):可以定义切点、各类通知和引入的内容;通知(advice):分为前置通知(before)、后置通知(after)、事后返回通知(afterReturning)、异常通知(afterThrowing);织入(weaving):为原有服务(service)对象生成代理对象,然后将与切点匹配的连接点拦截,并将各类通知加入约定流程;目标对象(target):被代理对象。
9. FastDFS文件服务器
- FastDFS:开源的轻量级分布式文件系统,用于解决大数据量存储和负载均衡等问题。
- 优点:支持HTTP协议传输文件(结合Nginx);对文件内容做Hash处理,节约磁盘空间;支持负载均衡、整体性能较佳。
- FastDFS的两个角色:跟踪服务器(Tracker)、存储服务器(Storage)。
- 跟踪服务器:主要做调度工作,起到负载均衡的作用。它是客户端和存储服务器交互的枢纽。
- 存储服务器:主要提供容量和备份服务,存储服务器是以组(Group)为单位,每个组内可以有多台存储服务器,数据互为备份。文件及属性(Meta Data)都保存在该服务器上。
10. Nginx的了解
- Nginx是一个 轻量级/高性能的反向代理Web服务器,他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用nginx网站用户有很多,例如:新浪、网易、 腾讯等。
- Nginx的主要特点:跨平台、配置简单易上手、高并发(能支持2-3万,官方支持5万)、内存消耗小、稳定性高
- nginx性能高的原因:异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决
- 优点:占内存小,可实现高并发连接,处理响应快;可实现http服务器、虚拟主机、方向代理、负载均衡;Nginx配置简单;可以不暴露正式的服务器IP地址。缺点:动态处理差:nginx处理静态文件好,耗费内存少,但是处理动态页面则很鸡肋,现在一般前端用nginx作为反向代理抗住压力。
11. 弹幕系统
- 场景分析:客户端针对某一视频创建了弹幕,发送后端进行处理,后端需要对所有正在观看该视频的用户推送该弹幕。
- 实现方式:使用短连接进行通信或使用长连接进行通信。
- 短连接实现方案:所有观看视频的客户端不断轮询后端,若有新的弹幕则拉取后进行显示。
- 短连接的缺点:轮询的效率低,非常浪费资源(因为HTTP协议只能由客户端向服务端发起,故必须不停连接后端)
- 长连接方案:采用WebSocket进行前后端通信
- 为什么要用WebSocket:HTTP 协议的通信只能由客户端发起,做不到服务器主动向客户端推送信息。
- WebSocket简介:WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(Full-Duplex)通信。报文体积小、支持长连接
- 全双工通信:客户端可以主动发送信息给服务端,服务端也可以主动发送信息给客户端。
12. 对Redis的了解
- Redis是一个基于键值对的Nosql数据库,Redis中拥有string,hash,list,set,zset等多种数据结构,还提供bitmap,geo等数据结构。 Redis最常用来做缓存,是实现分布式缓存的首先中间件; Redis可以作为数据库,实现诸如点赞、关注、排行等对性能要求极高的互联网需求; Redis可以作为计算工具,能用很小的代价,统计诸如PV/UV、用户在线天数等数据; Redis还有很多其他的使用场景,例如:可以实现分布式锁,可以作为消息队列使用。
- Redis的多种数据结构带来了满足多种应用场景的能力,而且Redis将所有数据放到内存中的做法让它的读写性能十分惊人。不仅如此,Redis的持久化机制保证了在发生类似断电,机械故障等情况时,内存中的数据不会丢失。此外Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等多个附加功能。总之,在合适的情况下使用Redis会大大增强系统的性能,减少开发人员工作量。
- Redis访问速度快、支持的数据类型丰富,很适合用来储存热点数据、 而且适用业务广,如可以运用expire命令来做限时业务,设置一个键的生存时间,到时间后Redis会自动删除它,如排行榜可以借助redis的SortedSet进行热点数据的排序,还有分页查询,模糊查询,点赞好友等。
- Redis的单线程结构:不依赖 CPU,其瓶颈最有可能是机器内存或者网络带宽,并不是说多线程就一定比单线程性能好,因为频繁的CPU上下文切换会影响效率。
- Redis的悲观锁和乐观锁,悲观锁:setnx(set if not exists),直接锁住key,保证只有一个人去load db;乐观锁:watch,当key的version改变了,会提示修改失败。
- Redis的秒杀功能:事务和乐观锁(mutil+watch+decr)
- Redis的持久化:RDB,文件名为dump.rdb,文件内容为快照;使用bgsave命令来fork一个子进程来实现手动持久化;使用配置文件来实现,通过匹配配置来触发持久化机制;shutdown的时候也会触发持久化。AOF,文件名为appendonly.aof,文件内容为命令集。使用配置文件来实现,通过匹配配置来触发持久化机制。
边栏推荐
- [Flutter] dart: class; abstract class; factory; Class, abstract class, factory constructor
- QT qcombobox add qccheckbox (drop-down list box insert check box, including source code + comments)
- MySQL学习03
- Socket编程
- awk从入门到入土(1)awk初次会面
- Return a tree structure data
- How to find summer technical internship in junior year? Are you looking for a large company or a small company for technical internship?
- Deep learning notes (constantly updating...)
- Gbase 8C system table PG_ conversion
- elastic stack
猜你喜欢
通达OA v12流程中心
Visualisation de l'ensemble de données au format yolov5 (fichier labelme json)
Tongda OA V12 process center
Visual yolov5 format data set (labelme JSON file)
Job object of collaboration in kotlin
How do it students find short-term internships? Which is better, short-term internship or long-term internship?
《上市风云》荐书——唯勇气最可贵
stm32F407-------ADC
The use of Flink CDC mongodb and the implementation of Flink SQL parsing complex nested JSON data in monggo
How to deal with cache hot key in redis
随机推荐
Visualisation de l'ensemble de données au format yolov5 (fichier labelme json)
[Yu Yue education] reference materials of love psychology of China University of mining and technology
【CodeForces】CF1338A - Powered Addition【二进制】
es6 filter() 数组过滤方法总结
Awk from introduction to earth (0) overview of awk
Cfdiv2 Fixed Point Guessing - (2 points for Interval answer)
SPI mechanism
Detailed introduction to the deployment and usage of the Nacos registry
[Flutter] dart: class;abstract class;factory;类、抽象类、工厂构造函数
Job object of collaboration in kotlin
y54.第三章 Kubernetes从入门到精通 -- ingress(二七)
Unrecognized SSL message, plaintext connection?
Deep learning notes (constantly updating...)
Exception handling in kotlin process
GBase 8c系统表-pg_authid
How to deal with cache hot key in redis
Groovy, "try with resources" construction alternative
[shutter] bottom navigation bar implementation (bottomnavigationbar bottom navigation bar | bottomnavigationbaritem navigation bar entry | pageview)
What are MySQL locks and classifications
GBase 8c触发器(二)