互联网高并发解决方案相关面试题

高并发服务限流特技有哪些算法?

传统计算器算法,滑动窗口计数器算法,令牌桶算法和漏桶算法。

传统计数器限流算法有什么弊端?

传统计数器限流方式不支持高并发,存在线程安全问题.若大量访问请求集中在计数器最后时刻,计数器极易发生临界问题,访问的请求无法完成.

什么是滑动窗口计数器?

滑动窗口计数器是一种服务限流的算法,相对于计数器方法的实现,滑动窗口实现会更加平滑,并自动消除毛刺。其原理是当有访问进来时,会判断若干个单位来的请求是否超过设置的阀值,并对当前时间片的请求数+1.

 

令牌桶算法的原理?

向一个存放固定容量令牌的桶,以固定速率往桶里添加令牌,当桶已经装满时,新增的令牌会被丢弃或者拒绝,当一个固定数目的数据包到达时,会在桶中删除同等数量的令牌,数据包会发到网络上,当这个固定数目超过桶中的令牌数,不会删除桶中的令牌数目,则该数据包会被限流(丢弃或者存入缓冲区等待)

漏桶算法的原理?

向一个存放固定容量的桶,以任意速率滴入水滴(请求),以固定速率滴出水滴,当滴入水滴量超过桶中设置固定容量,则会发生溢出,溢出的水滴的请求是无法访问的,直接走服务限流降级,桶中的容量不发生任何变化。

令牌桶与漏桶算法的区别?

令牌桶和漏桶算法的区别是令牌桶会根据请求的令牌数与桶中的令牌数做对比,倘若桶中令牌数小于请求令牌数则多余的令牌数的请求被拒绝。漏桶算法则是向桶中添加请求,当请求数大于桶中容量发生溢出,溢出的请求直接被拒绝访问。主要区别是漏桶算法是强行限制数据的传输速率,而令牌桶在能够限制数据的平均传输速率外,还允许某种程度的突发传输,使用于抢红包等高并发的场景。

Web前端优化方案

Web前端有哪些优化方案

1.网站框架实行动静分离,动态资源和和静态资源部署到不同的服务器上面,使用nginx访问本地静态资源,通过nginx代理转发到tomcat访问动态资源

2.在访问静态资源时在Url后缀加上时间戳,防止访问资源的与浏览器本地缓存资源存在冲突.

3.页面减少HTTP请求,合并静态资源(如js或者css)并进行压缩。

4.使用CDN内容分发,缓存静态资源,让用户访问最近的服务器,减少宽带之间的传输.

 

什么是CDN内容分发?

CDN内容转发是指在用户和服务器之间加上一个缓存机制,一组分布在不同的静态资源服务器,储存静态资源,动态获取用户IP,并让用户访问最近的静态资源服务器,防止出现网络延迟阻塞,提高访问速度。CND服务器部署在网络运营商的机房,用户请求首先会访问CND服务器,如果CND服务器中没有缓存会自动把创建缓存,当用户再次访问时,直接获取缓存资源,并返回给前端,提高静态资源的访问速度。

 

CDN内容加速原理?

1)用户向浏览器提供要访问的域名.

2)浏览器从本地host文件中解析域名,如何host文件没有做任何配置,则浏览器调用域名解析库对域名进行解析,析函数库一般得到的是该域名对应的CNAME记录,从中获取真正的IP地址,此过程中,根据地理位置信息解析对应的IP地址,使得用户能就近访问静态资源服务器。

3)此次解析的CDN服务器的IP地址,浏览器根据这个地址,向缓存服务器发出请求。

4)缓存服务器根究浏览器访问的域名,通过缓存内部获得此域名的真实IP地址,再有缓存服务器提交该IP地址的访问请求。

5)缓存服务器从服务器的ip地址获取内容备用,并将数据返回给用户,完成服务过程.

6)客户端将服务器返回的数据展示给前端

 

互联网高并发解决方案

首先在谈到高并发解决方案的时候,很多学员可能都会想到服务器应该做集群、负载均衡。

那么服务器集群,一定能解决高并发吗?这其实不一定。

首先要分清楚高并发影响用户的源头?是因为带宽不够还是服务内存不足?

服务带宽指的是:客户端与服务器传输的宽度的速度,1m 等于 128kb。

服务内存指的是:服务器端处理业务能力。

那么解决高并发的入口是客户端与服务器端传输带宽速度, 如果带宽速度不足的情况,可能会导致客户端延迟等待。

一个网站核心 分为静态资源(css、img、js)和动态资源(jsp、ftl)组合,绝大数的情况下静态资源占了整个网站带宽传输, 这时候应该采用网站动静分离架构,将动态资源与静态资源分开服务器存放,注意:网站跨域问题。

动静分离可以使用 nginx,或者是使用第三方静态资源服务器比如七牛云、阿里云等。

还要对静态资源实现压缩、减少带宽的传输,使用 CDN 实现内容分发,从最近服务器访问。

如何对静态资源实现压缩呢? 使用 nginx 开启 gzip、maven 打包压缩 min 格式、或者使用 cdn 自带压缩

以上这些属于 Web 前端优化。

 

如果客户端发送请求已经达到服务器端的话,服务端处理响应产生延迟,那么开始采用后端优化方案。

.可以对服务器实现集群 、加服务配置、采用 MQ 异步传输、使用 Redis 做缓存,减轻数据库访问压力、代码优化、数据库采用:读写分离和分表分库,程序采用多线程、jvm 参数调优,服务实现保护机制(服务降级、服务隔离、服务熔断、服务限流)等。

Web 前端优化大多数情况下,属于公司运维干的事情,后端优化属于架构师做的事情,如果一个网站中静态资源非常多的情况下,不要将静态资源和动态资源在同一个服务器存放,一定要采用动静分离架构,提高网站的吞吐量。

 

    最后总结下,如果服务器带宽不足的情况下,服务器接受客户端请求资源,可能会产生延迟,服务器做集群、加配置,效果不会很明显,因为服务器集群只能提高服务器的业务处理能力,不能提高服务器的带宽传输,

所以可以采用以上总结的 Web 前端优化方案,减少客户端与服务器端带宽传输。

.如果在带宽的足够的情况下,客户端发送请求已经到达了后端服务器,服务器端处理能力产生延迟,那么采用以上总结 后端优化方案

服务器集群、加服务器配置等。

之前有一位学员问,app 客户端遇到高并发,是采用后端优化还是前端优化,app 属于 cs 架构,静态资源在打包的时候已经在安装包里面,不需要远程获取,业务逻辑需要远程调用接口,获取 json 数据进行解析,让后展示数据,所以 app 客户端产生的高并发,核心在于后端优化。

你可能感兴趣的:(java,面试储备)