限流

		
高并发系统的保护策略:限流、降级、缓存


限流算法:

	漏桶算法(Leaky Bucket)

		概念:请求从漏桶的入口处流入到漏桶中,漏桶以一定的速率将请求从出口处流出,当漏桶已满时(请求的流入速度大于请求的流出速度会导致桶满),新的请求无法流入到漏桶中,即这部分请求被拒绝了。

		目的:无论请求流入漏桶的速率有多大,漏桶将请求流出的速率是不变的,故漏桶可以平滑网络上的突发流量。

		缺点:
			1)漏桶是延迟执行。即后流入的请求只能等到在它之前流入的请求都执行后才能被执行。
			2)漏桶无法对突发的流量做额外的处理,即当流量burst时,漏桶是将部分请求直接丢弃掉,而不是选择其它的策略来应对这突发的流量。
		
	令牌桶算法(Token Bucket)

		概念:按照一定的速率往令牌桶中添加token,当令牌桶满时,新添加的token会被丢弃。
		
		实现:
			1)在令牌桶中添加一定数量的令牌,一个令牌允许接口处理1个单元的数据。(1单元的数据可以是1bit大小的数据,也可以是1Byte大小的数据,还可以是集合中的一个元素)
			2)添加令牌的速度是恒定的,当桶满时,新添加的令牌会被丢弃。
			3)接口处理数据前,需要从令牌桶中获取一定数量的令牌,当桶中的令牌不足时,接口需要等待。
			4)我们通过设定添加令牌的速率来控制该接口处理数据的速率。
			

		特点:
			1)非延迟执行,只要桶中的令牌数大于等于接口需要令牌数,则接口立即执行。
			2)令牌桶限制的是数据的平均处理(传输)速率,漏桶限制的是数据的瞬时处理速率。
			3)允许一定程度的突发流量,即一次拿多个令牌。
	
	
限流实现:
	
	分布式限流:nginx实现应用服务器集群的负载均衡;遇到流量洪峰(秒杀场景)时,将90%的用户请求打到排队动画页面。

	进入应用服务器前限流:配置nginx的限流模块(limit_conn、limit_req)

	在应用服务器内限流:配置tomcat的线程池。
	
	调用业务接口前限流:使用MQ削峰(将请求发送到MQ中,然后MQ以一定的速度将请求发送给业务接口)。

	在业务接口中限流:Guava的RateLimiter
	


流量整形(traffic shaping):

	概念:流量整形即主动调整(限制)流量的输出速率。
	
	说明:流量整形通常使用缓冲区和令牌桶来完成:首先将数据缓存在缓冲区中,然后通过令牌桶均匀的发送这些被缓存的数据。
	
	应用:当数据的发送速度过快时,需要通过流量整形来控制数据的发送速率。eg:调用第三方api接口时,第三方api接口对QPS有限制。


	
	


你可能感兴趣的:(分布式)