问题:
一个网站,每一秒最多可以处理1000个请求,但如果某一时刻有2000个请求同时发出,该网站该怎么应对?
思路:
首先,要能够对每一秒发出的请求进行计数,这样才能对请求进行相应的处理
解决:
对请求进行计数:
一般针对网站的问题都要从客户端,服务器端两方面进行考虑。
- 客户端显然是针对某一用户而言,是一个局部的概念。而要对每一秒发出的请求进行计数,这显然是一个全局性的概念,所以要在服务器端进行计数。
- 明确了要在服务器端进行计数,下面讨论如何进行计数。由于要统计每一秒发出的请求数,可以利用数据库进行解决。设计一个表,有两个字段,一个字段是时间,精确到秒,第二个字段就是此时间对应的
请求数,当服务器端接受到客户端发来的一个请求后,就用其时间到表中进行查询,若表中没有这个时间,就进行插入,并把请求数字段设为1,若表中有这个时间,就进行更新操作,即把请求数字段加1。
处理请求
当能够对每一秒的请求数进行计数时,我们就要对超过网站最高处理能力进行处理.
- 拦截,在某一秒当某个请求到达时,通过查询数据库,判断请求数大于1000时,及停止处理该请求,直接返回一个页面,提醒用户此时服务器端无法处理请求,请稍候刷新。为防止用户刷新次数过多,导致用户体验变差,可以做如下改善:不等到请求数大于1000时,才停止处理该请求,而是首先设置一个负载因子,当某一秒的请求数大于1000×负载因子时,就开始随机拒绝一些请求,返回相同的提示页面。
- ip拒绝:在一段时间内,如果有某个ip频繁的访问网站,可以认为是恶意攻击或者网络爬虫,他们的高频率访问影响了正常用户对网站的访问,因此如果网站发现某个ip在某段时间内的访问次数超过了正常数值,就可以屏蔽此ip地址,拒绝为其服务。
注意:
1.当一秒接收到请求过多时,对数据库的访问频率也会增加,此时,数据库的处理能力就会成为整个网站的瓶颈此时,可将将Mysql数据库换成Memcache,Redies等更加高效的工具。
2.返回提示页面后,用户可以手动刷新以发出新的请求,但为了提高用户使用体验,我们也可以设置成自动刷新。此时,页面上可以有一个倒数计时器,时间一到,则页面进行自动刷新。
以上两种方式中,客户端发出的请求均到达了服务器端,即使是返回提示页面的请求,也消耗了服务器端的资源,那么有没有方式进一步减少服务器端的压力呢?有,如果用户请求的是一些静态资源,如CSS,JavaScript,Logo,图标等,则有以下方式进行解决。
- 服务器端缓存:将用户请求访问次数多的页面或数据缓存在服务器中,可以减轻服务器端和数据库的压力。
- 浏览器缓存:即将静态资源缓存在浏览器中。
- CDN(Content Distribute Network 内容分发网络):CDN部署在网络运营商的机房,这些运营商又是终端用户的网户的网络服务提供商,因此用户请求的第一跳就到达了CDN服务器,当CDN中存在浏览器请求的资源时,从CDN 直接返回给浏览器,最短路径返回响应,加快了用户访问速度,减轻了后端服务器的负载压力。也可以看出,其本质就是一个缓存。
- 反向代理:反向代理部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器是反向代理服务器,如果反向代理服务器中缓存这用户请求的资源,就将其直接返回给用户,若没有,才到处理服务器上进行处理。其作用是加快用户访问速度,减轻了后端服务器的负载压力。也可以看出,其本质就是一个缓存。
网友评论