web项⽬处理⾼并发解决思路
⼀、CDN缓存(⽹络请求上游)
CDN其实是⼀种资源的分布式存放和备份的⽅法。解决因分布、带宽、服务器性能带来的访问延迟问题,适⽤于站点加速、秒杀、点播、直播等场景。使⽤户可以就近取得所需内容,解决Internet⽹络拥挤的状况,提⾼⽤户访问⽹站的响应速度和成功率。
通俗讲就是讲web服务器上的资源进⾏缓存,⽤户请求时,在⽹络请求的上游就可以就近将资源分发给⽤户。⽽不需要所有的⽤户都去web 跟服务器就去请求资源。
常规web请求处理流程
1.⽤户在⾃⼰的浏览器中输⼊要访问的⽹络域名
2.浏览器向本地DNS(域名解析服务器)服务器请求对该域名的解析
3.本地DNS服务器中如果缓存有这个域名的解析结果,则直接响应⽤户的解析请求
4.本地DNS服务器中如果没有关于这个域名的解析结果的缓存,则以递归⽅式向整个DNS系统请求解析,获得应答后将结果反馈给浏
览器
5.浏览器得到域名解析结果,就是该域名相应的服务设备的ip
6.浏览器向服务器请求内容
7.服务器将⽤户请求内容传送给浏览器
引⼊CDN后web请求处理流程
1.当⽤户点击⽹站页⾯的内容URL,经过本地DNS系统解析,DNS系统会最终将域名的解析权交给CNAME指向的CDN专⽤DNS服务
器。
2.CDN的DNS服务器将CDN的全局负载均衡设备IP返回⽤户
3.⽤户向CDN的全局负载均衡设备发情内容URL访问请求
4.CDN全局负载均衡设备根据⽤户IP地址,及⽤户请求的内容URL,选择⼀台⽤户所属区域负载均衡设备,让⽤户向这台设备发起请求
5.区域负载均衡设备会为⽤户选择⼀台合适的缓存服务器提供服务
6.⽤户向缓存服务器发起请求,缓存服务器响应⽤户请求,将⽤户所需内容传送到⽤户终端
7.如果这台缓存服务器上没有⽤户想要的内容,那么这台服务器就要向它的上⼀级缓存服务器请求内容,直⾄追溯到⽹站原服务器将内
容拉取到本地
⼆、nginx反向代理(⽹络请求中间层)web后端是指什么
nginx反向代理的作⽤:
负载均衡:
使⽤反向代理同时代理多个相同内容的应⽤服务器(⽐如tomcat),将客户端请求分发到各个应⽤服务器上并接收响应返回给客户端动静分离:
运⽤Nginx的反向代理功能分发请求:所有动态资源的请求交给应⽤服务器,⽽静态资源的请求(例如图⽚、视频、CSS、JavaScript⽂件等)则直接由Nginx返回到浏览器
常见web⽹站架构设计:
反向代理的⽔平扩展
反向代理的⽔平扩展,是通过“DNS轮询”实现的:dns-server对于⼀个域名配置了多个解析ip,每次DNS解析请求来访问dns-server,会轮询返回这些ip。
当nginx成为瓶颈的时候,只要增加服务器数量,新增nginx服务的部署,增加⼀个外⽹ip,就能扩展反向代理层的性能,做到理论上的⽆限⾼并发。
站点层的⽔平扩展(分布式部署)
站点层的⽔平扩展,是通过“nginx”实现的。通过修改f,可以设置多个web后端。
当web后端成为瓶颈的时候,只要增加服务器数量,新增web服务的部署,在nginx配置中配置上新的web后端,就能扩展站点层的性能,做到理论上的⽆限⾼并发。
三、站点的缓存技术(web应⽤层)
1.数据缓存:
对于不会频繁变动⽽访问量⼜⽐较⼤的数据可以做缓存处理,可以缓存到内存型数据库、客户端等。
2.页⾯静态化:
html静态化也是某些缓存策略使⽤的⼿段,对于系统中频繁使⽤数据库查询但是内容更新很⼩的应⽤,可以考虑使⽤html静态化来实现
3.图⽚服务器分离:
对于Web服务器来说,图⽚是最消耗资源的,于是我们有必要将图⽚与页⾯进⾏分离,这是基本上⼤型⽹站都会采⽤的策略,他们都有独⽴的、甚⾄很多台的图⽚服务器。
四、数据库
1.硬件优化
2.数据库读写分离、主从同步
使⽤负载均衡实现,写操作都往主库上写,读操作往从服务器上读。
3.分库分表
分表⽅式
⽔平分割(按⾏)、垂直分割(按列)
分表场景
A: 根据经验,mysql表数据⼀般达到百万级别,查询效率就会很低。
B: ⼀张表的某些字段值⽐较⼤并且很少使⽤。可以将这些字段隔离成单独⼀张表,通过外键关联,例如考试成绩,我们通常关注分数,不关注考试详情。
C:把⼀个订单⼤表拆开,订单表、订单⽀付表、订单商品表。
⽔平分表策略
按时间分表:当数据有很强的实效性,例如微博的数据,可以按⽉分割。
按区间分表:例如⽤户表 1到⼀百万⽤⼀张表,⼀百万到两百万⽤⼀张表。
hash分表:通过⼀个原始⽬标id或者是名称按照⼀定的hash算法计算出数据存储的表名。
4.索引优化
将经常被⽤到且变动不太频繁的列使⽤索引,索引不是越多越好,因为数据变动时索引都要重新计算。
5.SQL优化
  1、尽量避免全表扫描,⾸先硬考虑在 where 及 order by 涉及的列上简历索引。
  2、应尽量避免在 where ⼦句中对字段进⾏ null 值判断,否则将导致引擎放弃使⽤索引⽽进⾏全表扫描。
  3、应尽量避免在 where ⼦句中使⽤ != 或者 <> 操作符,否则将引擎放弃使⽤索引⽽进⾏全表扫描。
  4、like + 双通配符% 通常也会导致全表扫描。
6.字段优化
合理准确的使⽤字段类型及控制字段的长度等。
例如,char能满⾜就不⽤varchar

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。