请选择 进入手机版 | 继续访问电脑版

面试官要是问你如何解决web高并发,你就这样回答

0
回复
67
查看
[复制链接]

20

主题

20

帖子

70

积分

注册会员

Rank: 2

积分
70
发表于 2019-8-14 07:09:42 | 显示全部楼层 |阅读模式
 
"\u003Cdiv\u003E\u003Cp class=\"ql-align-justify\"\u003E所谓高并发,就是同一时间有许多流量(通常指用户)访问程序的接口、页面及其他资源,解决高并发就是当流量峰值到来时保证程序的稳定性。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E我们一般用QPS(每秒查询数,又叫每秒请求数)来权衡程序的综合性能,数值越高越好,一般需要压测(ab工具)得到数据。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E假设我们的一个历程(也可以是线程或者协程)处置处罚一次请求花费了50毫秒(业内达标范围一般是20毫秒至60毫秒),那么1秒钟就可以处置处罚20个请求,一台服务器是可以开许多这样的历程并行去处置处罚请求的,好比开了128个,那么这台机器理论上的QPS=2560。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E千万不要小瞧这个数字,当你的QPS真有这么高的时间意味着你的DAU(用户日活)有2560*200=51.2万,业内一般是放大200倍盘算,有这样的日活说明做得很不错了。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E一台服务器能够到达的最大QPS受许多因素的影响,好比机器参数配置、机房地理位置、CPU性能、内存巨细、磁盘性能、带宽巨细、程序语言、数据库性能、程序架构等,我们逐一细说。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E1.机器参数配置\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E这个很好理解,好比服务器最大可以开启128个历程,你设置了最大只开启100个,这属于服务器调优。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E2.机房地理位置\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E如果你做外洋用户,服务器机房应该选择国外的,反之应该选择国内的,因为机房间隔用户越近,在传输上的时间损耗就越低。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E3.CPU性能\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003ECPU性能越好,处置处罚速度就越快,焦点数越多,能够并行开启的历程就越多。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E4.内存巨细\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E内存越大,程序就能把更多的数据直接放到内存,从内存读取数据比从磁盘读取数据的速度快许多。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E5.磁盘性能\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E这个不用多说吧,一般固态硬盘的性能比机械硬盘的性能好许多,性能越好读写数据的速度就越快。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E6.带宽巨细\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E服务器的带宽一般指流出带宽,单位为Mb\u002FS,好比带宽为8Mb\u002FS即1MB\u002FS,如果提供文件下载服务,可能一个用户的下载行为就把服务器带宽用完了。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E一般把图片、视频、css文件、JavaScript脚本等资源放到第三方的CDN去,按流量计费,这样就不占用服务器带宽了。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E如果用户规模小,基本上一台服务器就好了,这个时间一般会选按固定带宽巨细计费。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E如果用户规模很大了,基本上会用到负载均衡器来分流,即把流量按照一定的规则分配到差别的服务器上,负载均衡器一般会按流量来计费。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E如果均匀一次请求返回的数据巨细为50KB,为了到达1000QPS这个指标,需要的带宽峰值=1000\u003Cem\u003E50\u003C\u002Fem\u003E8\u002F1024=390.625Mb\u002FS。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E我们在设计接口的时间应该只管淘汰返回的数据巨细,好比user_id就可以简化为uid,像图片、视频、css等文件压缩的目的就是淘汰数据的巨细。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E7.程序语言\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E编译型语言的性能一般好于解释型语言的性能,好比go语言性能就好于php语言性能,当语言短期不会更换时,可以通过堆机器解决高并发问题。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E8.数据库性能\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E一台服务器上部署的数据库总是有一个瓶颈的,好比每秒查询数、每秒写入数。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E我们可以通过增长许多从库解决查询(select语句)的瓶颈,称之为多从库模型,需要注意的是主从同步数据可能有延迟,当修改数据后马上需要查询时需要设置强制从主库读取。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E我们可以将业务拆分,让某些表存储在一个数据库实例上,另一些表存储在其他数据库实例上,固然一个数据库实例有自己的瓶颈,但是许多的数据库实例堆积起来性能就会大大改善,多个数据库实例的方案称之为多主库模型,主要是为了解决写入瓶颈(insert语句、update语句、delete语句)。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E如果你有多个主库又有多个从库,你就实现了多主多从模型。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E如果一个表存储的数据量很大,这个时间就要考虑分表了(一般用中心件实现),好比按时间分表或者按用户分表,当把一个表的所有分表都放在一个数据库实例上都满意不了要求的时间,你应该把某些分表存储在新的数据库实例上,这个时间一个表的数据分布到了差别的数据库实例上,这就是所谓的分布式数据库方案了,你需要处置处罚的事情就很复杂了,好比处置处罚分布式事务。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E数据库的并发连接数也是有限制的,我们可以用连接池技能来应对,就是保持一定数量的和数据库的连接不断开的长连接,需要连接数据库的时间就从池子里选择一个连接,用完放回去就好了,这个一般也是用中心件来实现。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E好的索引也能进步数据库的性能,有时间比堆多个从库的方案还要好。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E如果能够淘汰数据库的读写,也算间接进步了数据库的性能,好比我们用redis来做缓存,用消息队列异步落库等。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E有时间某些数据用数据库来盘算需要很长时间,可以取到元数据(最小粒度的数据)用程序来盘算,这称之为用内存换时间。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E9.程序架构\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E好比实现同样的功能,初级程序员写的程序需要循环100次,而高级程序员写的程序只需要循环10次,效果肯定不一样。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E总结\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E一般大型项目基本是前后端分离的,从性能方面说就是为了将页面渲染的处置处罚在客户端运行,降低服务器的压力。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E从带宽层面考虑,css、图片、视频、JavaScript等文件资源能用CDN的就用CDN,能压缩的就只管压缩,接口能减小返回数据的巨细就只管减小。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E为了解决编程语言的不敷或者单台服务器的瓶颈,可以先堆机器应对。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E索引、多主多从、分布式数据库、缓存、连接池、消息队列等是从数据库方便考虑如何优化性能。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E有时间程序的耦合性低比程序的性能高更紧张,不要一味地追求高性能。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002Ff3232204b35f4de7a629a632f95bc932\" img_width=\"640\" img_height=\"640\" alt=\"口试官要是问你如何解决web高并发,你就这样回答\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003C\u002Fdiv\u003E"'.slice(6, -6),      groupId: '6724600441054691847
北京赛车幸运飞艇PK10分分彩时时彩新疆时时彩重庆时时彩五分彩老重庆时时彩三分彩二分彩,福彩3D,排列三极速赛车,北京赛车,PC蛋蛋老北京赛车广东11选5山东11选5江西11选5上海11选5幸运快三湖北快三安徽快三上海快三广西快三北京快三
回复

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

信息推荐

更多+

最新信息

更多+

关注我们:UI手游网

qaqa345678

官方微信

全国服务热线:

4000-018-018

公司地址:上海市嘉定区银翔路655号B区1068室

运营中心:成都市锦江区东华正街42号广电仕百达国际大厦25楼

邮编:610066 Email:mail@yidai.com

Copyright   ©2015-2019  UI手游  Powered by©Discuz!  技术支持:UI手游