高併發系統三大利器:緩存、降級(熔斷)和限流。算法
很好理解,在高併發系統中,沒有緩存,數據庫分分鐘就被玩跪了。使用緩存不僅僅可以提高系統訪問速度、提升併發訪問量,也是保護數據庫、保護系統的有效方式。數據庫
二者類似,可是仍是有區別的。緩存
降級:針對於總體服務,總體負荷超出總體負載承受能力時,延遲或暫停非重要服務,例如日誌收集服務,保證重要服務正常運行。網絡
熔斷:針對於單個服務,當某一服務出現了過載現象,爲防止形成整個系統故障,從而採用的一種保護措施。直接關閉該服務(比較暴力)或者保證部分請求成功,另外一部分直接返回失敗(不佔用服務資源),eg.若是5秒鐘以內連續請求失敗次數達到20次,那麼觸發熔斷機制,過濾60%的請求。併發
限流能夠認爲服務降級的一種,限流就是限制系統的訪問量已達到保護系統的目的。高併發
常見的限流算法有:計數器、漏桶和令牌桶算法。spa
計數器:日誌
一個典型的應用場景就是規定在固定的時間內,只容許經過固定數量的請求,如規定在一分鐘內只容許處理100個請求。資源
基本思想:有一個counter。當一個請求到來的時候,首先判斷如今是不是處於新的時間段裏。若是是在新的時間段了,就能夠把counter清0,而後對當前這個請求進行計數加一操做。假如沒有處於新的時間段,則判斷當前的counter的數量是否超過規定的數量,如100。超過了就丟棄請求,不然對計數器加一,容許該請求經過。配置
存在問題:精度不夠,請求分佈不平均。當在時間的臨界區的時候,可能會出現問題。例如,規定一分鐘處理100個請求,第一秒就有100個請求,也會形成系統壓力,後面59秒系統空閒。
漏筒算法:
一個固定容量的漏桶,按照常量固定速率流出水滴;
若是桶是空的,則不需流出水滴;
能夠以任意速率流入水滴到漏桶;
若是流入水滴超出了桶的容量,則流入的水滴溢出了(被丟棄),而漏桶容量是不變的。
令牌桶算法:
一個存放固定容量令牌的桶,按照固定速率往桶裏添加令牌。
假如咱們如今是國慶放假,故宮要作限流措施,對故宮的遊客數量進行控制。所以工做人員準備半個小時,派出100張票,也就是每半個小時生成100張票。假如遊人不少,那麼每次100張票都能在半小時內用完,其餘遊客沒票了,只能在外面等着,不讓進。那假如遊人不多,半個小時100張沒用完,那麼就會累積在那兒,半個小時後又新生成100張。所以售票處的票會愈來愈累積起來。假如忽然來了一個大型旅行團,遊客數量不少,那麼此時因爲前面還累積了不少票,所以即便這個旅行團超過100,也能使他們每一個人都有票。
漏桶和令牌桶算法的區別
「漏桶算法」可以強行限制數據的傳輸速率,而「令牌桶算法」在可以限制數據的平均傳輸速率外,還容許某種程度的突發傳輸。在「令牌桶算法」中,只要令牌桶中存在令牌,那麼就容許突發地傳輸數據直到達到用戶配置的門限,因此它適合於具備突發特性的流量。 (在突發傳輸時,漏桶算法即便有不少空閒資源也會按照必定速率傳輸,令牌桶算法則能夠在足夠空間的前提下,一次性進行傳輸)