| |
面试官要是问你如何解决web高并发,你就这样回答 |
|
珠江路在线
2019年8月14日
【
转载
】今头日条一小马奔腾 编辑:
|
|
|
所谓高并发,便是同一 工夫有众多流量(通常指消费者) 拜访程序的接口、页面及 其余资源,解决高并发便是当流量峰值到来时 保障程序的 巩固性 。
我们普通用QPS(每秒 查问数,又叫每秒 申请数)来 衡量程序的综合性能,数值越高越好,普通需求压测(ab工具)得到数据 。
假如我们的一个 历程(也 能够是线程或者协程) 解决一次 申请 花费了50毫秒(业内达标 规模普通是20毫秒至60毫秒),那么1秒钟就 能够 解决20个 申请,一台服务器是 能够开众多这样的 历程并行去 解决 申请的, 比方开了128个,那么这台机器 实际上的QPS=2560 。
千万不要小瞧这个数字,当你的QPS真有这么高的时候 象征着你的DAU(消费者日活)有2560*200=51.2万,业内普通是放大200倍计算,有这样的日活 注明做得很不错了 。
一台服务器 能够达到的最大QPS受众多因素的影响, 比方机器参数配置、机房地理位置、CPU性能、内存大小、磁盘性能、带 宽容小、程序语言、数据库性能、程序架构等,我们逐个细说 。
1.机器参数配置
这个很好 了解, 比方服务器最大 能够开启128个 历程,你设置了最大只开启100个,这属于服务器调优 。
2.机房地理位置
假如你做海外消费者,服务器机房应该 取舍国外的,反之应该 取舍国内的,由于机房 间隔消费者越近,在传输上的 工夫损耗就越低 。
3.CPU性能
CPU性能越好, 解决速度就越快,核心数越多, 能够并行开启的 历程就越多 。
4.内存大小
内存越大,程序就能把更多的数据直接放到内存,从内存读取数据比从磁盘读取数据的速度快众多 。
5.磁盘性能
这个不用多说吧,普通固态硬盘的性能比机械硬盘的性能好众多,性能越好读写数据的速度就越快 。
6.带 宽容小
服务器的带宽普通指流出带宽,单位为Mb/S, 比方带宽为8Mb/S即1MB/S,假如提供文件下载服务,可能一个消费者的下载行为就把服务器带宽用完了 。
普通把图片、视频、css文件、JavaScript脚本等资源放到第三方的CDN去,按流量计费,这样就不占用服务器带宽了 。
假如消费者规模小, 根本上一台服务器就好了,这个时候普通会选按固定带 宽容小计费 。
假如消费者规模很大了, 根本上会用到负载 均衡器来分流,即把流量依照 定然的 规定 调配到不同的服务器上,负载 均衡器普通会按流量来计费 。
假如 均匀一次 申请返回的数据大小为50KB,为了达到1000QPS这个指标,需求的带宽峰值=1000508/1024=390.625Mb/S 。
我们在设计接口的时候应该尽量削减返回的数据大小, 比方user_id就 能够简化为uid,像图片、视频、css等文件压缩的 目标便是削减数据的大小 。
7.程序语言
编译型语言的性能普通好于解释型语言的性能, 比方go语言性能就好于php语言性能,当语言短期不会替换时, 能够通过堆机器解决高并 发问题 。
8.数据库性能
一台服务器上部署的数据库总是有一个瓶颈的, 比方每秒 查问数、每秒写入数 。
我们 能够通过添加众多从库解决 查问(select语句)的瓶颈,称之为多从库模型,需求 留神的是主从同步数据可能有延迟,当 批改数据后即将需求 查问时需求设置强制从主库读取 。
我们 能够将业务拆分,让某些表存储在一个数据库实例上,另一些表存储在 其余数据库实例上, 固然一个数据库实例有自己的瓶颈,然而众多的数据库实例 沉积起来性能就会大大改善,多个数据库实例的 方案称之为多主库模型,重要是为了解决写入瓶颈(insert语句、update语句、delete语句) 。
假如你有多个主库又有多个从库,你就实现了多主多从模型 。
假如一个表存储的数据量很大,这个时候就要考量分表了(普通用之间件实现), 比方按 工夫分表或者按消费者分表,当把一个表的全 部分表都放在一个数据库实例上都满足不了要求的时候,你应该把某些分表存储在新的数据库实例上,这个时候一个表的数据 分布到了不同的数据库实例上,这便是所谓的 分布式数据库 方案了,你需求 解决的 事件就很复杂了, 比方 解决 分布式事务 。
数据库的并发衔接数也是有 制约的,我们 能够用衔接池技术来 应答,便是 维持 定然数量的和数据库的衔接不停开的长衔接,需求衔接数据库的时候就从池子里 取舍一个衔接,用完放回去就好了,这个普通也是用之间件来实现 。
好的索引也能 遍及数据库的性能,有时候比堆多个从库的 方案还要好 。
假如 能够削减数据库的读写,也算 直接 遍及了数据库的性能, 比方我们用redis来做缓存,用 信息队列异步落库等 。
有时候某些数据用数据库来计算需求很长期, 能够取到元数据(最小粒度的数据)用程序来计算,这称之为用内存换 工夫 。
9.程序架构
比方实现同样的 性能,初级程序员写的程序需求循环100次,而高级程序员写的程序 只有求循环10次, 动机 确定不一样 。
总结
普通大型 名目 根本是前后端 拆散的,从性能方面说便是为了将页面渲染的 解决在客户端运行,减低服务器的压力 。
从带宽层面考量,css、图片、视频、JavaScript等文件资源能用CDN的就用CDN,能压缩的就尽量压缩,接口能减小返回数据的大小就尽量减小 。
为了解决编程语言的缺乏或者单台服务器的瓶颈, 能够先堆机器 应答 。
索引、多主多从、 分布式数据库、缓存、衔接池、 信息队列等是从数据库容易考量如何优化性能 。
有时候程序的耦合性低比程序的性能高更重要,不要一味地 谋求高性能 。
