如何应对网站流量暴增

       若是流量忽然飙大,总有一个资源会遇到瓶颈。按照经验大概出问题地方是DB,磁盘io、CPU、带宽、链接数、内存其中的一个或几个。不一样的业务,不一样的系统设计,出问题的地方会有所不一样。若是流量增大数倍,势必某个资源会在瞬间被榨干,而后全部的服务都会“开小差”,引发用户的抱怨。而解决问题的关键,是在问题发生时,尽可能减小出问题的资源被访问。

一、流量暴涨的缘由

    通常状况下,引发网站流量暴增大体为如下两种状况
  一、不可预测流量(网站被恶意刷量;CDN回源抓取数据;合做业务平台调取平台数据等)
  二、可预测流量(忽然爆发的社会热点,营销活动的宣传;)web

         不论是可预测流量仍是不可预测流量都会表如今带宽和网站总体架构的应对方案上算法

         若是因为带宽缘由引发,因为网站的并发量过高,达到服务器的吞吐极限,致使服务器宕机,这时须要作临时申请加大带宽,而后负载均衡分流。
         若是因为外网请求数据库,致使数据库频繁读写,数据库处理能力低,致使大量请求积压;若是是这种状况,就须要优化SQL,存储过程等,若是是请求过大,就要考虑作集群等。
        可预测流量的暴增也会拖慢网页的打开速度,甚至致使网站服务器宕机。要应对正常流量暴增,在流量高峰期到来以前就能够适当的调整,通常针对应用服务器的调整能够防止单点,负载均衡,高可用,增长后端web应用服务器数量,数据库读写分离,拆库拆表等,防止流量暴增致使服务器挂掉,下面具体说明:数据库

二、防止流量暴涨预备方案

凡事预则立不预则废,作任何事情,都要未雨绸缪,若是等到大军打到家门口,再迎战就只能被人宰割了。后端

2.一、流量估算

 

      做为一个经验充足的老运维,能够把设计流量*3做为系统压力的下限,即实现完了要压测,压测获得的结果要达到设计流量 * 3( * 4, * 5均可以),好比服务器在IDC机房,在签合同以前就能够说明当流量异常的时候,提供必定的缓冲带宽,若是是云服务器,能够临时加带宽。
      关键是要给系统留些缓冲。一旦发生了什么,不至于挂的太惨。此时,通常会获得一个带缓存的业务服务系统。考虑到缓存高于后台服务2~3个数量级的性能优点,多撑几倍流量通常不成问题。

2.二、降级方案

      降级总得是用户能够买帐的方式才行,不能瞎降。能降级成什么样,显示成什么样子,都得预先设计好。UI上有的要配图,有的要出警告语提示。而做为后台服务器,须要有对应的实时开关,一旦设置,马上进入降级方案。缓存

     可是,若是核心服务就是热点自己,就没得降级,好比,电商的双十一,用户的购买,下单等行为,下单就是下单,不能下一半,不能砍掉支付,不能随机性有的能买有的不能买,是涉及到大量写操做,并且是核心链路,没法降级的,这个时候,限流就比较重要了。服务器

2.二、限流方案

限流的经常使用方式架构

限流的经常使用处理手段有:计数器、滑动窗口、漏桶、令牌。并发

 计数器负载均衡

计数器是一种比较简单的限流算法,用途比较普遍,在接口层面,不少地方使用这种方式限流。在一段时间内,进行计数,与阀值进行比较,到了时间临界点,将计数器清0。

 局限性:运维

这里须要注意的是,存在一个时间临界点的问题。举个栗子,在12:01:00到12:01:58这段时间内没有用户请求,而后在12:01:59这一瞬时发出100个请求,OK,而后在12:02:00这一瞬时又发出了100个请求。这里你应该能感觉到,在这个临界点可能会承受恶意用户的大量请求,甚至超出系统预期的承受。

滑动窗口

因为计数器存在临界点缺陷,后来出现了滑动窗口算法来解决。

局限性:

滑动窗口的意思是说把固定时间片,进行划分,而且随着时间的流逝,进行移动,这样就巧妙的避开了计数器的临界点问题。也就是说这些固定数量的能够移动的格子,
将会进行计数判断阀值,所以格子的数量影响着滑动窗口算法的精度。

漏桶

虽然滑动窗口有效避免了时间临界点的问题,可是依然有时间片的概念,而漏桶算法在这方面比滑动窗口而言,更加先进。 有一个固定的桶,进水的速率是不肯定的,可是出水的速率是恒定的,当水满的时候是会溢出的。

令牌桶

注意到,漏桶的出水速度是恒定的,那么意味着若是瞬时大流量的话,将有大部分请求被丢弃掉(也就是所谓的溢出)。为了解决这个问题,令牌桶进行了算法改进。

局限性:

生成令牌的速度是恒定的,而请求去拿令牌是没有速度限制的。这意味,面对瞬时大流量,该算法能够在短期内请求拿到大量令牌,并且拿令牌的过程并非消耗很大的事情。(有一点生产令牌,消费令牌的意味) 不管是对于令牌桶拿不到令牌被拒绝,仍是漏桶的水满了溢出,都是为了保证大部分流量的正常使用,而牺牲掉了少部分流量,这是合理的,若是由于极少部分流量须要保证的话,那么就可能致使系统达到极限而挂掉,得不偿失。

限流神器:Guava RateLimiter

Guava不只仅在集合、缓存、异步回调等方面功能强大,并且还给咱们封装好了限流的API! Guava RateLimiter基于令牌桶算法,咱们只须要告诉RateLimiter系统限制的QPS是多少,那么RateLimiter将以这个速度往桶里面放入令牌,而后请求的时候,经过tryAcquire()方法向RateLimiter获取许可(令牌)。