如何准备系统设计面试?

1:系统设计面试一般怎么问?
1:设计一个某某系统比如秒杀系统、微博系统、抢红包系统、短网址系统。
2:设计一个框架比如 RPC 框架、消息队列、缓存框架、分布式文件系统等等。
3:设计某某系统中的一个功能比如哔哩哔哩的点赞功能。
4:某某系统的技术选型比如缓存用Redis 还是 Memcached、网关用 Spring Cloud Gateway 还是Netflix Zuul2 。
2:系统设计怎么做?
1:问清楚系统具体要求
    当面试官给出了系统设计题目之后,一定不要立即开始设计解决方案。
    需要先问清楚:功能性需求和非功能性需求。
    
    为啥要询问清楚系统的功能性需求也就是说系统包含哪些功能呢?
    为啥要询问清楚系统的非功能性需求或者说约束条件比如系统需要达到多少QPS呢?

2:对系统进行抽象设计
    先画出系统的抽象架构图,这个抽象架构图中包含了系统的一些组件以及这些组件之间的连接。

3:考虑系统目前需要优化的点
    1:当前系统部署在一台机器够吗?是否需要部署在多台机器然后进行负载均衡呢?
    2:数据库处理速度能否支撑业务需求?是否需要给指定字段加索引?是否需要读写分离?是否需要缓存?
    3:数据量是否大到需要分库分表?
    4:系统是否需要分布式文件系统?
    5:是否存在安全隐患?

4:优化你的系统抽象设计
    针对第三步,对系统的抽象设计做进一步完善。
3:实战
不断通过实战项目锻炼自己的系统设计能力。
4:保持好奇心
1:你刷微博的时候可以思考一下微博是如何记录点赞数量的?
2:你看哔哩哔哩的时候可以思考一下消息提醒系统是如何做的?
3:你使用短链系统的时候可以考虑一下短链系统是如何做的?
5:技术选型
    实现同样的功能,一般会有多种技术选择方案,比如缓存用Redis 还是 Memcached、网关用 Spring Cloud Gateway 还是Netflix Zuul2 。
    很多时候,面试官在系统设计面过程中会具体到技术的选型,因而,你需要区分不同技术的优缺点。
6:性能相关的指标
响应时间
响应时间RT(Response-time)就是用户发出请求到用户收到系统处理结果所需要的时间。(反映了处理用户请求速度)

并发数
并发数可以简单理解为系统能够同时供多少人访问使用也就是说系统同时能处理的请求数量。(反应了负载能力)

QPS 和 TPS
QPS(Query Per Second) :服务器每秒可以执行的查询次数;
TPS(Transaction Per Second) :服务器每秒处理的事务数(这里的一个事务可以理解为客户发出请求到收到服务器的过程);
区别:
    QPS vs TPS:QPS 基本类似于 TPS,
    对于一个页面的一次访问,形成一个TPS;
    一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“QPS”之中。
    如,访问一个页面会请求服务器2次,一次访问,产生一个“T”,产生2个“Q”。
    
吞吐量
吞吐量指的是系统单位时间内系统处理的请求数量。    

QPS(TPS) = 并发数/平均响应时间(RT)
7:系统活跃度
PV(Page View)访问量, 即页面浏览量或点击量,衡量网站用户访问的网页数量;
在一定统计周期内用户每打开或刷新一个页面就记录1次,多次打开或刷新同一页面则浏览量累计。
UV 从网页打开的数量/刷新的次数的角度来统计的。

UV(Unique Visitor)独立访客,统计1天内访问某站点的用户数。
1天内相同访客多次访问网站,只计算为1个独立访客。UV 是从用户个体的角度来统计的。

DAU(Daily Active User)日活跃用户数量。

MAU(monthly active users)月活跃用户人数

举例:某网站 DAU为 1200w, 用户日均使用时长 1 小时,RT为0.5s,求并发量和QPS。

平均并发量 = DAU(1200w)* 日均使用时长(1 小时,3600秒) /一天的秒数(86400)=1200w/24 = 50w
峰值并发量 = 平均并发量 * 6 = 300w

真实并发量(考虑到某些时间段使用人数比较少) = DAU(1200w)* 日均使用时长(1 小时,3600秒) /一天的秒数-访问量比较小的时间段(假设为8小时(57600))=1200w/16 = 75w
QPS = 真实并发量/RT = 75W/0.5=100w/s
8:常用性能测试工具
Jmeter :Apache JMeter 是 JAVA 开发的性能测试工具。
Galtling :一款基于Scala 开发的高性能服务器性能测试工具。
ab :全称为 Apache Bench 。Apache 旗下的一款测试工具,非常实用。
9:前端常用
Fiddler:抓包工具,它可以修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是Web 调试的利器。
HttpWatch: 可用于录制HTTP请求信息的工具。
10:常见软件QPS
Nginx :一般情况下,系统的性能瓶颈基本不会是 Nginx。单机 Nginx 可以达到 30w +。

Redis: Redis 官方的性能测试报告:https://redis.io/topics/benchmarks 。
从报告中,我们可以得出 Redis 的单机 QPS 可以达到 8w+(CPU性能有关系,也和执行的命令也有关系比如执行 SET 命令甚至可以达到10w+QPS)。

MySQL: MySQL 单机的 QPS 为 大概在 4k 左右。

Tomcat :单机 Tomcat 的QPS 在 2w左右。
             这个和你的 Tomcat 配置有很大关系,举个例子Tomcat 支持的连接器有 NIO、NIO.2 和 APR。 
             AprEndpoint 是通过 JNI 调用 APR 本地库而实现非阻塞 I/O 的,性能更好,Tomcat 配置 APR 为 连接器的话,QPS 可以达到 3w左右
11:性能优化必知法则
SQL优化,JVM、DB,Tomcat参数调优 
> 硬件性能优化(内存升级、CPU核心数增加、机械硬盘—>固态硬盘等等)
> 业务逻辑优化/缓存 
> 读写分离、集群等 
> 分库分表
12:常见的性能优化策略
1:系统架构本身是不是就有问题?
2: 数据库索引使用是否合理?
3:当前系统的SQL语句是否存在问题?
4:当前系统是否需要升级硬件?
5:系统是否需要缓存?
6:系统是否存在死锁的地方?
7:系统的耗时操作进行了异步处理
8:系统是否存在内存泄漏?(Java 的自动回收内存虽然很方便,但是,有时候代码写的不好真的会造成内存泄漏)
13:系统设计面试的注意事项
1:想好再说
2:没有绝对的答案
3:权衡利弊  (所有的东西都是有代价的)
4:慢慢优化 (不要想着一步到位)
5:追求稳定的技术

KISS(Keep It Simple ,Stupid)

你可能感兴趣的:(如何准备系统设计面试?)