高並發情境下的流控管理

來源:互聯網
上載者:User

標籤:

     任何應用都有一個設計指標,當應用的壓力超過了他設計所能承載的能力時,就好比一座只允許行人通過的獨木橋,是無法承載一輛坦克的重量的,這個時候,為了讓機器能夠繼續運行,在不宕機的情況下盡其所能的對一部分使用者提供服務,保證整個流程能夠繼續走下去,這個時候,就必須對應用進行流控,丟棄一部分使用者的請無法避免。

    流控可以從多個維度來進行,比如針對QPS,並發線程數,黑白名單,加權分級等等,最典型最直接的便是針對QPS和並發線程數的流控。當然,要進行流控,首先等有一個流控的閥值,這個閥值不是說拍拍腦袋就能夠想出來,不同類型的應用,所面臨的情況不一樣,也沒有一個統一的衡量標準,必須經過多輪的壓力測試,才能夠得出一個比較靠譜的數值。

一、簡單的流控

1、使用Semphore進行並發流控

 類比代碼如下所示:

  Semaphore semphore = new Semaphore(10);    if(semphore.getQueueLength() > 10){     //等待隊列閥值為10時      return;    }    try {     semphore.acquire();            //幹活           } catch (InterruptedException e) {         e.printStackTrace();    }finally{       semphore.release();//釋放    }  

也可以參見:http://ifeve.com/concurrency-practice-1/

2、使用樂觀鎖加環境切換進行流控

public void enter(Object obj){       boolean isUpdate = false;      int countValue = count.get();      if(countValue > 0){          isUpdate = count.compareAndSet(countValue, countValue -1);           if(isUpdate)return;      }        concurQueue.add(obj);        try {          obj.wait();      } catch (InterruptedException e) {          logger.error("flowcontrol thread was interrupted .......",e);      }      return ;   }    public void release(){        synchronized(count){          if(count.get() < VALVE){              count.set(count.get() + 1);          }      }        Object obj = concurQueue.remove();      if(obj != null){          synchronized (obj) {              obj.notify();          }      }      System.out.println("notify ...............");      return ;  }  

具體採用訊號量還是使用環境切換形式,需要根據臨界程式碼片段執行的時間而定

      當請求進來時,調用配置的concurrentlock的enter方法,判斷是否達到閥值,如果沒有達到閥值,則進入,進行處理, 處理完後計數器加1,如果已經達到閥值則放入等待隊列,因為等待隊列是消耗記憶體的,因此等待隊列也必須有閥值,如果隊列超過閥值,請求直接丟棄
二、漏鬥演算法和桶令牌演算法

    利用現存的演算法,比如:漏鬥演算法和桶令牌演算法進行流量的控制。

   關於漏鬥演算法和桶令牌演算法可以參考:http://www.inter12.org/archives/962

                                                                https://blog.jamespan.me/2015/10/19/traffic-shaping-with-token-bucket/

1、漏桶演算法(Leaky bucket)

漏桶演算法強制一個常量的輸出速率而不管輸入資料流的突發性,當輸入空閑時,該演算法不執行任何動作.就像用一個底部開了個洞的漏桶接水一樣,水進入到漏桶裡,桶裡的水通過下面的孔以固定的速率流出,當水流入速度過大會直接溢出,可以看出漏桶演算法能強行限制資料的傳輸速率.如所示:


2、令牌桶(Token bucket)

  令牌桶演算法的基本過程如下:

  1. 每秒會有 r 個令牌放入桶中,或者說,每過 1/r 秒桶中增加一個令牌
  2. 桶中最多存放 b 個令牌,如果桶滿了,新放入的令牌會被丟棄
  3. 當一個 n 位元組的資料包到達時,消耗 n 個令牌,然後發送該資料包
  4. 如果桶中可用令牌小於 n,則該資料包將被緩衝或丟棄

漏桶和令牌桶比較

“漏桶演算法”能夠強行限制資料的傳輸速率,而“令牌桶演算法”在能夠限制資料的平均傳輸資料外,還允許某種程度的突發傳輸。在“令牌桶演算法”中,只要令牌桶中存在令牌,那麼就允許突發地傳輸資料直到達到使用者配置的上限,因此它適合於具有突發特性的流量。

高並發情境下的流控管理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.