高并发系统三大利器:缓存、降级(熔断)和限流。算法
很好理解,在高并发系统中,没有缓存,数据库分分钟就被玩跪了。使用缓存不仅仅可以提高系统访问速度、提升并发访问量,也是保护数据库、保护系统的有效方式。数据库
二者类似,可是仍是有区别的。缓存
降级:针对于总体服务,总体负荷超出总体负载承受能力时,延迟或暂停非重要服务,例如日志收集服务,保证重要服务正常运行。网络
熔断:针对于单个服务,当某一服务出现了过载现象,为防止形成整个系统故障,从而采用的一种保护措施。直接关闭该服务(比较暴力)或者保证部分请求成功,另外一部分直接返回失败(不占用服务资源),eg.若是5秒钟以内连续请求失败次数达到20次,那么触发熔断机制,过滤60%的请求。并发
限流能够认为服务降级的一种,限流就是限制系统的访问量已达到保护系统的目的。高并发
常见的限流算法有:计数器、漏桶和令牌桶算法。spa
计数器:日志
一个典型的应用场景就是规定在固定的时间内,只容许经过固定数量的请求,如规定在一分钟内只容许处理100个请求。资源
基本思想:有一个counter。当一个请求到来的时候,首先判断如今是不是处于新的时间段里。若是是在新的时间段了,就能够把counter清0,而后对当前这个请求进行计数加一操做。假如没有处于新的时间段,则判断当前的counter的数量是否超过规定的数量,如100。超过了就丢弃请求,不然对计数器加一,容许该请求经过。配置
存在问题:精度不够,请求分布不平均。当在时间的临界区的时候,可能会出现问题。例如,规定一分钟处理100个请求,第一秒就有100个请求,也会形成系统压力,后面59秒系统空闲。
漏筒算法:
一个固定容量的漏桶,按照常量固定速率流出水滴;
若是桶是空的,则不需流出水滴;
能够以任意速率流入水滴到漏桶;
若是流入水滴超出了桶的容量,则流入的水滴溢出了(被丢弃),而漏桶容量是不变的。
令牌桶算法:
一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。
假如咱们如今是国庆放假,故宫要作限流措施,对故宫的游客数量进行控制。所以工做人员准备半个小时,派出100张票,也就是每半个小时生成100张票。假如游人不少,那么每次100张票都能在半小时内用完,其余游客没票了,只能在外面等着,不让进。那假如游人不多,半个小时100张没用完,那么就会累积在那儿,半个小时后又新生成100张。所以售票处的票会愈来愈累积起来。假如忽然来了一个大型旅行团,游客数量不少,那么此时因为前面还累积了不少票,所以即便这个旅行团超过100,也能使他们每一个人都有票。
漏桶和令牌桶算法的区别
“漏桶算法”可以强行限制数据的传输速率,而“令牌桶算法”在可以限制数据的平均传输速率外,还容许某种程度的突发传输。在“令牌桶算法”中,只要令牌桶中存在令牌,那么就容许突发地传输数据直到达到用户配置的门限,因此它适合于具备突发特性的流量。 (在突发传输时,漏桶算法即便有不少空闲资源也会按照必定速率传输,令牌桶算法则能够在足够空间的前提下,一次性进行传输)