漏桶有一定的容量,給漏桶注水,當單位時間內注入水量大於流出水量,漏桶內積累的水就會越來越多,直到溢位。就好比大批量請求訪問nginx相當於注水,nginx根據配置按照固定速率處理請求當做排水。
漏桶容量就好比配置給nginx的佇列長度。當漏桶發生溢位,則禁止請求進入,直接返回錯誤
* [leaky php實現漏桶演算法]
* @param [type] $contain [int 桶的總容量]
* @param [type] $addnum [int 每次注入桶中的水量]
* @param [type] $leakrate [int 桶中漏水的速率,秒為單位。例如2/s,3/s]
* @param integer &$water [int 當前水量]
* @param integer &$pretime [int 時間戳,記錄的上次漏水時間]
* @return [type] [bool,返回可否繼續注入true/false]
*/function leaky($contain,$addnum,$leakrate,&$water=0,&$pretime=0)
else }
/*** 測試
* @var integer
*/for($i=0;$i<500;$i++)
令牌桶public function speedcounter() else
} else
} } else
漏桶演算法
漏桶的大小是固定的,處理速度也是固定的,但是請求的速率的不固定的。在突發的情況下,會丟棄很多請求。
/*** **漏桶的大小是固定的,處理速度也是固定的,但是請求的速率的不固定的。在突發的情況下,會丟棄很多請求。**
*/function leackbucket() else
} else
}
令牌桶演算法(token bucket)和 leaky bucket 效果一樣但方向相反的演算法,更加容易理解.隨著時間流逝,系統會按恆定1/qps時間間隔(如果qps=100,則間隔是10ms)往桶裡加入token(想象和漏洞漏水相反,有個水龍頭在不斷的加水),如果桶已經滿了就不再加了.新請求來臨時,會各自拿走乙個token,如果沒有token可拿了就阻塞或者拒絕服務.
令牌桶的另外乙個好處是可以方便的改變速度. 一旦需要提高速率,則按需提高放入桶中的令牌的速率. 一般會定時(比如100毫秒)往桶中增加一定數量的令牌, 有些變種演算法則實時的計算應該增加的令牌的數量.
/**
* 令牌
*/function trafficshaper() else
}
基於Redis實現的單點登入
背景 每個web應用都有自己的session,那如何在分布式或者集群環境下統一session,即如何實現單點登入,如下圖 解決方案 把session資料存放在redis,統一管理,向外提供服務介面,redis可以設定過期時間,對應session的失效時間 優點 訪問速度快,效率高 無單點故障,可以部...
spring基於redis實現訊息訂閱
本文主要記錄一下如何使用spring基於redis提供的pub sub模型來實現訊息的發布和訂閱處理,只記錄幾個需要注意的切入點.org.springframework.bootgroupid spring boot starter data redisartifactid 2.1.6.releas...
基於sklearn實現Bagging演算法(pyth
圖中a,b,c,d,e,f列表示六個特徵,g表示樣本標籤。每一行資料即為乙個樣本的六個特徵和標籤。實現bagging演算法的 如下 from sklearn.ensemble import baggingclassifier from sklearn.tree import decisiontree...