前言
負載均衡,大家應該聽的也不少了,也實踐過n次了。
當然也會知道,負載均衡是有不少演算法的:隨機,輪詢,加權輪詢,最少連線。。。。
本文重點說的是輪詢。
先舉個例子看看輪詢演算法是如何運作的。
假設我們的api站點有3臺負載(10.0.10.1,10.0.10.2和10.0.10.3),客戶端第一次請求api的時候,會訪問.1拿到結果,第二次會訪問.2拿到結果,第三次則會訪問.3拿到結果,後面就是依次類推。
在致就是這個樣子的訪問順序。
.1->.2->.3>.1>.2......
當然,上面的情況是太太太理想了!!只是能幫助我們理解輪詢是怎麼一回事!
下面是比較官方的描述:
按順序把每個新的連線請求分配給下乙個伺服器,最終把所有請求平分給所有的伺服器。
下面來簡單看看如何實現
簡單實現
我們圍繞的重點如下:
伺服器列表
上一次訪問的是那台機器
下一次要訪問的是那台機器
下面是實現
public class roundrobin
//伺服器列表
private readonly ilist _items;
//鎖private readonly object _synclock = new object();
//當前訪問的伺服器索引,開始是-1,因為沒有人訪問
private int _currentindex = -1;
public roundrobin(ienumerable sequence)
_items = sequence.tolist();
if(_items.count <= 0 )
throw new argumentexception("sequence contains no elements.", nameof(sequence));
public t getnextitem()
lock (this._synclock)
_currentindex++;
//超過數量,索引歸0
if (_currentindex >= _items.count)
_currentindex = 0;
return _items[_currentindex];
根據使用者不同的設計,伺服器有可能是乙個字串,也有可能是自定義的乙個類,所以設計成泛型引數會比較合適。
下面測試一下
static void main(string args)
//負載的api位址
var lburls = new list
"","",
"","",
//構造輪詢的物件
var robin = new roundrobin(lburls);
//訪問次數
var visitcount = lburls.count * new random().next(3, 5);
//常規的情況
console.writeline("begin one by one..");
for (int i = 0; i < visitcount; i++)
console.writeline($":sending request to ");
//並行的情況
console.writeline("begin parallel..");
parallel.for(0, visitcount, i =>
console.writeline($":sending request to ");
console.readkey();
結果:示例**:
實現乙個簡單的加權輪詢演算法
既然有了輪詢演算法的基礎,那麼對於加權輪詢的理解就簡單多了。同先舉個例子看看加權輪詢演算法是如何運作的。假設我們的api站點有2臺負載 10.0.10.1,10.0.10.2 但是.2這台機器的配置要比較高,所以會把它的權重設定的高一點。換句話就是說,我們是希望將比較多的請求可以落實到.2這台機器上...
乙個演算法的實現
某同學幫國外某mm做的題。演算法描述 首先將兩個字串和乙個臨界值作為引數傳入函式,比如 aaaaaaaaaa bbaaababaa 2,然後在函式中依次比較兩個字串的每個字元,當不同的字元數超過指定的臨界值後,繼續比較,並將大於等於臨界值且最大數目的第乙個字串中的相同字元轉換為大寫,比如,根據以上輸...
實現乙個redis連線池
jedis連線引數設定 redis伺服器ip redis.ip 169.254.130.122 redis伺服器端口號 redis.port 6379 redis訪問密碼 redis.password test123 與伺服器建立連線的超時時間 redis.timeout 3000 jedis池引數...