高併發系統的保護策略:限流、降級、緩存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有限制。