面试经典情景题:高并发解决方案
情景模拟:在很多个用户同时访问网站的时候,例如:抢购或者双十一的时候。如何避免服务器宕机或者数据库挂掉的问题,请你提供几种解决方案。
1、静态资源与后台服务进行分离
2、做页面静态化
静态化的意思就是将数据渲染后的动态页面变成一个html静态页面的保存起来,如果以后需要再次访问该页面,则将该请求重定向到静态页面。这样就不需要再向数据库或者缓存中拿去数据然后再进行渲染页面,返回到客户端。大大的提高了响应速度,减轻了服务端的负担。这个原理其实和缓存一样,只是将整个页面进行了缓存。nginx就自带了页面静态化的解决方案。
3、分布式和集群
分布式就是对整个系统进行水平拆分和垂直拆分。垂直拆分就是每一个功能模块都拆分成一个可以独立运行的微服务,从客户端发来的请求会根据所请求的功能转发到不同的微服务,这就避免了单体应用服务每一个请求都会请求同一个应用服务的问题。而且微服务还实现了模块与模块之间的解耦合,这样就避免了后期优化的时候,因为不知道谁调用谁而不敢修改代码的问题。而且如果一个微服务的并发量太大,可以对微服务进行水平扩展,也就是增加提供该服务的应用服务器数量,提高并发量,这就是我们所说的集群。水平拆分就是将每个微服务进行分层,实现微服务内部的解耦合。例如分为web层,service层,mapper层等等。分布式和集群是解决高并发的核心,它是整个系统架构的高并发解决方案。
4、反向代理
反向代理就是我们直接访问的服务器并不提供真正的系统服务,它只是个代理服务器,将发来的请求转发到真正的系统服务器里,一般比较常用的是nginx。它可以做负载均衡,避免集群里的应用服务分配请求不均匀导致的个别应用服务器宕机问题。
5、数据库集群和拆分
6、使用缓存
这个在一定程度上是可以提高用户的并发量的,但是如果访问量大的话,有可能会因为缓存数据过大,造成内存空间不足导致应用服务器挂掉。
7、消息队列流量削峰
前面处理高并发的方案都是通过优化后台服务来是实现的,那我们换个角度,我们对请求进行处理。我们先来模拟一个场景,就是怎么处理抢购的时候的一秒内数十万的高并发。在那么短的时间内,那么高的并发,那很有可能或让代理服务器瘫痪。为了避免这种情况,我们需要使用消息队列来进行流量削峰。原理也很简单,就是我们比如说抢购的商品只有1000件,但是却有10万个人抢购,那我们就用消息队列缓存先到的1000个请求,将后面的那些请求直接响应请求,提示抢购失败,然后慢慢的对缓存中的请求进行处理。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227904.html原文链接:https://javaforall.net
