Semaphore
- 在Semaphore信號量非常適合高并發訪問限制,新系統在上線之前,要對系統的訪問量進行評估,評估是經過以往的經驗、數據、歷年的訪問量,已經推廣力度進行一個合理的評估
- 當然評估標準不能太大也不能太小,太大的話投入的資源達不到實際效果,純粹浪費資源,太小的話,某個時間點一個高峰值的訪問量上來直接可以壓垮系統
相關概念
- PV(page view)網站的總訪問量,頁面瀏覽量或點擊量,用戶每刷新一次就會被記錄一次
- UV(unique Visitor)訪問網站的一臺電腦客戶端為一個訪客。一般來講時間上以00:00-24:00之內相同ip的客戶端只記錄。
- QPS(query per second)即每秒查詢數,qps很大程度上代表了系統業務上的繁忙程度,每次請求的背后,可能對應著多次磁盤I/O,多次網絡請求,多個cpu時間片等。我們通過qps可以非常直觀的了解當前系統業務情況,一旦當前qps超過所設定的預警閥值,可以考慮增加機器對集群擴容,以免壓力過大導致宕機,可以根據前期的壓力測試得到估值,在結合后期綜合運維情況,估算出閥值
- RT(response time)請求的響應時間,這個指標非常關鍵,直接說明前端用戶的體驗,任何系統設計師都想降低rt時間。
- 當然還涉及cpu、內存、網絡、磁盤等情況,更細節的問題很多,如select、update、delete/ps等數據庫層面的統計。
- 容量評估:一般來說通過開發、運維、測試、以及業務等相關人員,綜合出系統的一系列閥值,然后我們根據關鍵閥值如qps、rt等,對系統進行有效的變更
- 一般來講,我們進行多輪壓力測試以后,可以對系統進行峰值評估,采用所謂的80/20原則,即80%的訪問請求將在20%的時間內達到。這樣我們可以根據系統對應的PV計算出峰值qps
- 峰值qps= (總PV × 80%)/ (60 × 60 × 24 × 20%) 然后在將總的峰值qps除以單臺機器所能承受的最高的qps值,就是所需要機器的數量:機器數 = 總的峰值qps / 壓測得出的單機極限qps
- 當然不排除系統在上線前進行大型促銷活動,或者雙十一、雙十二熱點事件、遭受到DDos攻擊等情況,系統的開發和運維人員急需要了解當前系統運行的狀態和負載情況,一般都會有后臺系統去維護
代碼示例
package com.example.core.juc;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;public class UseSemaphore {public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(20);//定義20個線程Semaphore semaphore = new Semaphore(5);//每次只容許5個線程進行操作,進行限流for(int index = 1;index <= 20; index++){final int token = index;Runnable run = new Runnable() {@Overridepublic void run() {try{semaphore.acquire();//進行相關的業務操作System.out.println("獲得許可操作:"+token);long sleepTime = (long)(Math.random() * 10000);Thread.sleep(sleepTime);}catch(InterruptedException e){e.printStackTrace();}finally{semaphore.release();}}};executorService.execute(run);}// semaphore.getQueueLength();//取得等待許可的線程個數executorService.shutdown();}
}
/*
獲得許可操作:5
獲得許可操作:2
獲得許可操作:1
獲得許可操作:4
獲得許可操作:3
獲得許可操作:8
獲得許可操作:9
獲得許可操作:6
獲得許可操作:7
獲得許可操作:10
獲得許可操作:11
獲得許可操作:12
獲得許可操作:13
獲得許可操作:14
獲得許可操作:15
獲得許可操作:16
獲得許可操作:17
獲得許可操作:18
獲得許可操作:19
獲得許可操作:20*/
?