限流

高併發系統的保護策略:限流、降級、緩存nginx

限流算法:算法

漏桶算法(Leaky Bucket)

	概念:請求從漏桶的入口處流入到漏桶中,漏桶以必定的速率將請求從出口處流出,當漏桶已滿時(請求的流入速度大於請求的流出速度會致使桶滿),新的請求沒法流入到漏桶中,即這部分請求被拒絕了。

	目的:不管請求流入漏桶的速率有多大,漏桶將請求流出的速率是不變的,故漏桶能夠平滑網絡上的突發流量。

	缺點:
		1)漏桶是延遲執行。即後流入的請求只能等到在它以前流入的請求都執行後才能被執行。
		2)漏桶沒法對突發的流量作額外的處理,即當流量burst時,漏桶是將部分請求直接丟棄掉,而不是選擇其它的策略來應對這突發的流量。
	
令牌桶算法(Token Bucket)

	概念:按照必定的速率往令牌桶中添加token,當令牌桶滿時,新添加的token會被丟棄。
	
	實現:
		1)在令牌桶中添加必定數量的令牌,一個令牌容許接口處理1個單元的數據。(1單元的數據能夠是1bit大小的數據,也能夠是1Byte大小的數據,還能夠是集合中的一個元素)
		2)添加令牌的速度是恆定的,當桶滿時,新添加的令牌會被丟棄。
		3)接口處理數據前,須要從令牌桶中獲取必定數量的令牌,當桶中的令牌不足時,接口須要等待。
		4)咱們經過設定添加令牌的速率來控制該接口處理數據的速率。
		

	特色:
		1)非延遲執行,只要桶中的令牌數大於等於接口須要令牌數,則接口當即執行。
		2)令牌桶限制的是數據的平均處理(傳輸)速率,漏桶限制的是數據的瞬時處理速率。
		3)容許必定程度的突發流量,即一次拿多個令牌。

限流實現:api

分佈式限流:nginx實現應用服務器集羣的負載均衡;遇到流量洪峯(秒殺場景)時,將90%的用戶請求打到排隊動畫頁面。

進入應用服務器前限流:配置nginx的限流模塊(limit_conn、limit_req)

在應用服務器內限流:配置tomcat的線程池。

調用業務接口前限流:使用MQ削峯(將請求發送到MQ中,而後MQ以必定的速度將請求發送給業務接口)。

在業務接口中限流:Guava的RateLimiter

流量整形(traffic shaping):緩存

概念:流量整形即主動調整(限制)流量的輸出速率。

說明:流量整形一般使用緩衝區和令牌桶來完成:首先將數據緩存在緩衝區中,而後經過令牌桶均勻的發送這些被緩存的數據。

應用:當數據的發送速度過快時,須要經過流量整形來控制數據的發送速率。eg:調用第三方api接口時,第三方api接口對QPS有限制。
相關文章
相關標籤/搜索