1. 程式人生 > >Java並發編程(8)- 應用限流大發×××北京PK10×××及其常見算法

Java並發編程(8)- 應用限流大發×××北京PK10×××及其常見算法

ret ole 次數 ++ 影響 interval 最大 計數器 設定

應用限流大發×××北京PK10×××Q--2947702644
在開發高並發系統時,有三把利器用來保護系統:緩存、降級和限流:

緩存:緩存的目的是提升系統訪問速度和增大系統處理容量
降級:降級是當服務出現問題或者影響到核心流程時,需要暫時屏蔽掉,待高峰或者問題解決後再打開
限流:限流的目的是通過對並發訪問/請求進行限速,或者對一個時間窗口內的請求進行限速來保護系統,一旦達到限制速率則可以拒絕服務、排隊或等待、降級等處理
本文僅針對限流做一些簡單的說明,那麽何為限流呢?顧名思義,限流就是限制流量,就像你寬帶包了1個G的流量,用完了就沒了。通過限流,我們可以很好地控制系統的qps,從而達到保護系統的目的。本篇文章將會介紹一下常用的限流算法以及他們各自的特點。

限流本質上是控制某段代碼在一定時間內執行的次數,例如我們系統每天五點過後都有130w~140w的數據需要插入數據庫,若是直接一次性插入這些數據,必將導致數據庫連接被占滿無法接收其他處理的請求,數據庫的負載壓力會瞬間飆升,甚至是壓垮數據庫造成雪崩現象。所以我們需要對此操作進行限流,以一個恒定的速率去插入數據,假設每秒插入400條數據,當然這個數值需要根據實際情況去設定,如此一來就可以有效控制同一時間往數據庫插入的數據流不會很大,這樣就不會出現上述問題了
具體的偽代碼如下:

public class CounterDemo {
public long timeStamp = getNowTime(); // 當前時間

public int reqCount = 0; // 初始化計數器
public final int limit = 100; // 時間窗口內最大請求數
public final long interval = 1000; // 時間窗口ms

public boolean grant() {
    long now = getNowTime();
    if (now < timeStamp + interval) {
        // 在時間窗口內
        reqCount++;
        // 判斷當前時間窗口內是否超過最大請求控制數
        return reqCount <= limit;
    } else {
        timeStamp = now;
        // 超時後重置
        reqCount = 1;
        return true;
    }
}

}

Java並發編程(8)- 應用限流大發×××北京PK10×××及其常見算法