既然有了輪詢演算法的基礎,那麼對於加權輪詢的理解就簡單多了。
同先舉個例子看看加權輪詢演算法是如何運作的。
假設我們的api站點有2臺負載(10.0.10.1,10.0.10.2),但是.2這台機器的配置要比較高,所以會把它的權重設定的高一點。
換句話就是說,我們是希望將比較多的請求可以落實到.2這台機器上。
假設給.2這台機器設定的權重是2,.1的權重是1。那麼我們希望的結果就是,在3次請求中,2次落到.2上,1次落到.1上。
下面來簡單看看如何實現
其實最簡單的做法就是在輪詢演算法那裡傳入多個一樣的值就是代表它的權重。
var lburls = new list;
像這樣傳入,就代表在3次請求中會有2次落到.2。
其實這樣做也不是不可以,負載的機器的數量少可以這樣玩,當數量一多,不得眼花瞭亂啊!而且這樣做,加權輪詢就沒有什麼存在的意義了。
它更大的意義其實是在於均勻的分配。
舉個簡單的例子說明一下。
.1 權重 5
.2 權重 1
.3 權重 1
請問,下面的請求序列,那個更合適?
a. .1->.1->.1->.1->.1->.2->.3
b. .1->.1->.2->.1->.3->.1->.1
像a這樣的請求序列,一次性來5個到.1,這樣就失去了負載的意義了。
像b這樣的請求序列均勻的分布,是比較合適的。
我們圍繞的重點如下:
伺服器列表和權重
下一次要訪問的是那台機器
目前來說,貌似有兩種演算法來實現這個加權輪詢,一種是最大公約數的,一種是nginx的加權輪詢演算法。
但是,最大公約數生成的請求序列並不是十分的均勻,所以這裡就沒有採用,用的是nginx的這種處理方法。
下面是實現
public class weightedroundrobin);}}
public t getnextitem()
}_serverlist[index].current_weight -= total;
}return _serverlist[index].server;
}/// /// server config.
///
public class serverconfig
/// /// gets or sets the current weight.
///
/// the current weight.
public int current_weight
/// /// gets or sets the server.
///
/// the server.
public t server }}
下面測試一下
static void main(string args)
, ,,};
var robin = new weightedroundrobin(lburls);
var visitcount = lburls.values.sum() * new random().next(3, 5);
console.writeline("begin one by one..");
for (int i = 0; i < visitcount; i++)
:sending request to ");
}console.writeline("begin parallel..");
parallel.for(0, visitcount, i =>
:sending request to ");
});console.readkey();
}
結果:
示例**:
weightedroundrobindemo
redis實現輪詢演算法 實現乙個簡單的輪詢演算法
前言 負載均衡,大家應該聽的也不少了,也實踐過n次了。當然也會知道,負載均衡是有不少演算法的 隨機,輪詢,加權輪詢,最少連線。本文重點說的是輪詢。先舉個例子看看輪詢演算法是如何運作的。假設我們的api站點有3臺負載 10.0.10.1,10.0.10.2和10.0.10.3 客戶端第一次請求api的...
C 實現Nginx平滑加權輪詢演算法
很簡單,演算法很經典!1.定義實體類 public struct serverconfig 當前權重 public int current 服務名稱 public string name 2.演算法 public static int nextserverindex serverconfig ser...
PHP實現負載均衡的加權輪詢方法分析
負載均衡演算法有哪些?輪詢法 將請求按順序輪流地分配到後端伺服器上,它均衡地對待後端的每一台伺服器,而不關心伺服器實際的連線數和當前的系統負載。隨機法 通過系統的隨機演算法,根據後端伺服器的列表大小值來隨機選取其中的一台伺服器進行訪問。源位址雜湊法 根據獲取客戶端的ip位址,通過雜湊函式計算得到乙個...