回答自己:
Intially我一直在尋找一些能夠實現不同勢類型的平衡http://www.peplink.com/technology/load-balancing-algorithms/的, 連我都找到了一個不錯的文章http://www.codeproject.com/Articles/3338/NET-Dynamic-Software-Load-Balancing
最後,我已經決定要保持它的簡單,因爲我知道請求的權重我只需要更少的費用服務器。 編輯:爲每個服務器添加基礎權重。現在平衡是通過重量和負載完成的。代碼可以在linqpad
// Define other methods and classes here
public class LoadBalancer{
class Server{
public long Weight{ get; set;}
public long Load{ get; set;}
public string ConnectionString{ get; set;}
public long RequestCount;
// Return a weight based on the Load
public long CurrentWeight {
get{
var w = Weight - Load;
return w <= 0 ? 1: w;
}
}
}
List<Server> Servers;
public LoadBalancer(){
Servers = new List<Server>();
}
public void AddServer(long weight, string connection){
lock(Servers)
Servers.Add(new UserQuery.LoadBalancer.Server(){ ConnectionString = connection, Weight = weight });
}
static Random rnd = new Random();
// Returns server with less load
public string GetServer(int expectedLoad){
var hit = rnd.Next(0, (int)Servers.Sum(s => s.CurrentWeight));
long acc = 0;
foreach(var server in Servers){
if(hit < server.CurrentWeight + acc){
// Update load
lock(server){
server.Load += expectedLoad;
server.RequestCount++;
}
return server.ConnectionString;
}
acc += server.CurrentWeight;
}
throw new Exception("No servers available");
}
public void ReleaseServer(string conn, int expectedLoad){
var server = Servers.First(s => s.ConnectionString == conn);
// Update load
lock(server){
server.Load -= expectedLoad;
server.RequestCount--;
}
}
public IEnumerable<string> Dump(){
return Servers.Select(s => string.Format("Server: {0}, Requests: {1}, Weight: {2}, CurrentWeight: {3}",
s.ConnectionString, s.RequestCount, s.Weight, s.CurrentWeight));
}
}
void Main()
{
var balancer = new LoadBalancer();
// Add servers
balancer.AddServer(100, "Server1");
balancer.AddServer(100, "Server2");
balancer.AddServer(800, "Server3");
balancer.AddServer(200, "Server4");
balancer.AddServer(1000, "Server5");
var rnd = new Random();
var servers = new List<dynamic>();
Enumerable.Range(0, 100)
.All(i => {
var load = rnd.Next(1, 10);
var server = balancer.GetServer(load);
servers.Add(new {Server = server, Load = load});
if(i % 10 == 0){
balancer.Dump().Dump();
// Remove some load
var items = rnd.Next(0, servers.Count);
servers.Take(items)
.All(s => {
balancer.ReleaseServer(s.Server, s.Load);
return true;
});
servers = servers.Skip(items).ToList();
}
return true;
});
servers.All(s => {
balancer.ReleaseServer(s.Server, s.Load);
return true;
});
balancer.Dump().Dump();
}
Ops! Downvoted ...我做錯了什麼? http://meta.stackexchange.com/questions/135/encouraging-people-to-explain-downvotes – GBrian
除了「*我正在做負載均衡,您告訴我們您的問題沒有任何關係,我該如何讓它變得更好? *「 – RBarryYoung
非常感謝@RBarryYoung,我已經重寫了我的問題更清楚。 – GBrian