所以,你还要不断经过实战项目锻炼本身的系统设计能力。前端
多思考本身常常浏览的网站是怎么作的。好比:java
你刷微博的时候能够思考一下微博是如何记录点赞数量的?git
你看哔哩哔哩的时候能够思考一下消息提醒系统是如何作的?面试
你使用短链系统的时候能够考虑一下短链系统是如何作的?redis
…数据库
实现一样的功能,通常会有多种技术选择方案,好比缓存用Redis
仍是Memcached
、网关用 Spring Cloud Gateway
仍是Netflix Zuul2
。 不少时候,面试官在系统设计面过程当中会具体到技术的选型,于是,你须要区分不一样技术的优缺点。后端
系统设计的时候必然离不开描述性能相关的指标好比 QPS。性能优化
响应时间服务器
响应时间RT(Response-time)就是用户发出请求到用户收到系统处理结果所须要的时间。
RT是一个很是重要且直观的指标,RT数值大小直接反应了系统处理用户请求速度的快慢。
并发数
并发数能够简单理解为系统可以同时供多少人访问使用也就是说系统同时能处理的请求数量。
并发数反应了系统的负载能力。
QPS 和 TPS
QPS(Query Per Second) :服务器每秒能够执行的查询次数;
TPS(Transaction Per Second) :服务器每秒处理的事务数(这里的一个事务能够理解为客户发出请求到收到服务器的过程);
书中是这样描述 QPS 和 TPS 的区别的。
QPS vs TPS:QPS 基本相似于
TPS,可是不一样的是,对于一个页面的一次访问,造成一个TPS;但一次页面请求,可能产生屡次对服务器的请求,服务器对这些请求,就可计入“QPS”之中。如,访问一个页面会请求服务器2次,一次访问,产生一个“T”,产生2个“Q”。
吞吐量
吞吐量指的是系统单位时间内系统处理的请求数量。
一个系统的吞吐量与请求对系统的资源消耗等紧密关联。请求对系统资源消耗越多,系统吞吐能力越低,反之则越高。
TPS、 QPS都是吞吐量的经常使用量化指标。
QPS(TPS) = 并发数/平均响应时间(RT)
并发数 = QPS * 平均响应时间(RT)
介绍几个描述系统活跃度的常见名词,建议紧紧记住。你不光会在回答系统设计面试题的时候碰到,平常工做中你也会常常碰到这些名词。
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
真实并发量(考虑到某些时间段使用人数比较少) = DAU(1200w)* 日均使用时长(1 小时,3600秒) /一天的秒数-访问量比较小的时间段假设为8小时(57600)=1200w/16 = 75w
峰值并发量 = 平均并发量 * 6 = 300w
QPS = 真实并发量/RT = 75W/0.5=100w/s
后端经常使用
既然系统设计涉及到系统性能方面的问题,那在面试的时候,面试官就极可能会问:你是如何进行性能测试的?
推荐 4 个比较经常使用的性能测试工具:
Jmeter:Apache JMeter 是 JAVA 开发的性能测试工具。
LoadRunner:一款商业的性能测试工具。
Galtling:一款基于Scala 开发的高性能服务器性能测试工具。
ab:全称为 Apache Bench 。Apache 旗下的一款测试工具,很是实用。
没记错的话,除了 LoadRunner 其余几款性能测试工具都是开源免费的。
前端经常使用
Fiddler:抓包工具,它能够修改请求的数据,甚至能够修改服务器返回的数据,功能很是强大,是Web 调试的利器。
HttpWatch: 可用于录制HTTP请求信息的工具。
这里给出的 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左右。更多相关内容能够自行搜索 Tomcat 性能优化。
合适优于先进 > 演化优于一步到位 > 简单优于复杂
性能优化以前咱们须要对请求经历的各个环节进行分析,排查出可能出现性能瓶颈的地方,定位问题。
下面是一些性能优化时,我常常拿来自问的一些问题:
当前系统的SQL语句是否存在问题?
当前系统是否须要升级硬件?
系统是否须要缓存?
系统架构自己是否是就有问题?
系统是否存在死锁的地方?
数据库索引使用是否合理?
系统是否存在内存泄漏?(Java 的自动回收内存虽然很方便,可是,有时候代码写的很差真的会形成内存泄漏)
系统的耗时操做进行了异步处理?
……
SQL优化,JVM、DB,Tomcat参数调优 > 硬件性能优化(内存升级、CPU核心数增长、机械硬盘—>固态硬盘等等)> 业务逻辑优化/缓存 > 读写分离、集群等 > 分库分表
1.想好再说
不必面试官刚问了问题以后,你没准备好就开始回答。这样不会给面试官带来好印象的!系统设计本就须要面试者结合本身的以往的经验进行思考,这个过程是须要花费一些时间的。
2.没有绝对的答案
系统设计没有标准答案。重要的是你和面试官一块儿交流的过程。
2020年在匆匆忙忙慌慌乱乱中就这么度过了,咱们迎来了新一年,互联网的发展如此之快,技术突飞猛进,更新迭代成为了这个时代的代名词,坚持下来的技术体系会愈来愈健壮,JVM做为现在是跳槽大厂必备的技能,若是你还没掌握,更别提以后更新的新技术了。
更多JVM面试整理: