面试经典情景题:高并发解决方案

面试经典情景题:高并发解决方案

情景模拟:在很多个用户同时访问网站的时候,例如:抢购或者双十一的时候。如何避免服务器宕机或者数据库挂掉的问题,请你提供几种解决方案。

1、静态资源与后台服务进行分离

静态资源主要包括图片、视频、js、css和一些资源文件等,这些文件因为没有状态所以分离比较简单,直接存放到响应的服务器就可以了,一般会使用专门的域名去访问。通过不同的域名可以让浏览器直接访问资源服务器而不需要再访问应用服务器了。
这样在高并发的情况下是很有必要这样做的,可以想象一下,双十一的时候,浏览商品的并发量是远远高于下单的并发量的。架构图如下:
面试经典情景题:高并发解决方案_第1张图片

2、做页面静态化

静态化的意思就是将数据渲染后的动态页面变成一个html静态页面的保存起来,如果以后需要再次访问该页面,则将该请求重定向到静态页面。这样就不需要再向数据库或者缓存中拿去数据然后再进行渲染页面,返回到客户端。大大的提高了响应速度,减轻了服务端的负担。这个原理其实和缓存一样,只是将整个页面进行了缓存。nginx就自带了页面静态化的解决方案。

3、分布式和集群

分布式就是对整个系统进行水平拆分和垂直拆分。垂直拆分就是每一个功能模块都拆分成一个可以独立运行的微服务,从客户端发来的请求会根据所请求的功能转发到不同的微服务,这就避免了单体应用服务每一个请求都会请求同一个应用服务的问题。而且微服务还实现了模块与模块之间的解耦合,这样就避免了后期优化的时候,因为不知道谁调用谁而不敢修改代码的问题。而且如果一个微服务的并发量太大,可以对微服务进行水平扩展,也就是增加提供该服务的应用服务器数量,提高并发量,这就是我们所说的集群。水平拆分就是将每个微服务进行分层,实现微服务内部的解耦合。例如分为web层,service层,mapper层等等。分布式和集群是解决高并发的核心,它是整个系统架构的高并发解决方案。

4、反向代理

反向代理就是我们直接访问的服务器并不提供真正的系统服务,它只是个代理服务器,将发来的请求转发到真正的系统服务器里,一般比较常用的是nginx。它可以做负载均衡,避免集群里的应用服务分配请求不均匀导致的个别应用服务器宕机问题。

5、数据库集群和拆分

一个数据库的并发数是有限的,我们需要用多个数据库来提供服务,增加并发量,这是就需要对数据库做一个集群。
数据库本身也是需要进行优化的,我们需要对数据库进行垂直拆分和水平拆分。垂直拆分就是将数据表按照功能模块来进行划分,分别存储在不同的数据库服务器中。水平拆分就是对数据表进行读写分离,一个数据表或许有很多字段,但是有些字段可能在有些页面中读取较多,有些字段在其他页面写入修改较多,这时候我们就应该进行读写分离,将读较多的字段拆分为一个数据表,将写较多的字段拆分为另一个数据表。

6、使用缓存

这个在一定程度上是可以提高用户的并发量的,但是如果访问量大的话,有可能会因为缓存数据过大,造成内存空间不足导致应用服务器挂掉。

7、消息队列流量削峰

前面处理高并发的方案都是通过优化后台服务来是实现的,那我们换个角度,我们对请求进行处理。我们先来模拟一个场景,就是怎么处理抢购的时候的一秒内数十万的高并发。在那么短的时间内,那么高的并发,那很有可能或让代理服务器瘫痪。为了避免这种情况,我们需要使用消息队列来进行流量削峰。原理也很简单,就是我们比如说抢购的商品只有1000件,但是却有10万个人抢购,那我们就用消息队列缓存先到的1000个请求,将后面的那些请求直接响应请求,提示抢购失败,然后慢慢的对缓存中的请求进行处理。


作者:yuanfu
来源:CSDN
原文:https://blog.csdn.net/qq_36929638/article/details/101102230
版权声明:本文为博主原创文章,转载请附上博文链接!


你可能感兴趣的:(高并发,面试,解决方案,面试,高并发,大流量解决方案)