思路:獲取隨機數,隨機數不大於服務集合的容量,將該隨機數當作下標,獲取ip
// 服務ip集合
private
static list
serverips = arrays.
aslist
("a"
,"b"
,"c"
,"d"
,"e");
public
static string random()
思路:建立乙個新的list,將含有權重值得ip重新存入集合,權重是多少,就存多少個,然後使用隨機演算法從改集合中獲取乙個ip
public
static string random()
} random random =
newrandom()
;int i = random.
nextint
(ips.
size()
);return ips.
get(i)
;}
思路:演算法2中如果權重值過大,新建的list值就會很多,嚴重消耗記憶體,因此通過比較大小的方式確定隨機數落在那個服務上;將各個服務的權重值看做數軸上的點,通過判斷隨機數落在那個區間內,從而確定選哪個服務
public
static string random()
// 獲取隨機數
random random =
newrandom()
; integer pos = random.
nextint
(totalweigh)
;// 遍歷含權重的服務集合
for(string ip : map.
keyset()
) pos = pos - integer;
}return"";
}
思路1:設定全域性下標,每次請求都+1
// 服務ip集合
private
static list
serverips = arrays.
aslist
("a"
,"b"
,"c"
,"d"
,"e");
// 輪詢下標
private
static
int pos =0;
public
static string roundrobin()
string ip = serverips.
get(pos)
; pos++
;return ip;
}
思路2:通過取模,獲取下標
// 服務ip集合
private
static list
serverips = arrays.
aslist
("a"
,"b"
,"c"
,"d"
,"e");
// 原子計數器
private
static atomicinteger atomicnum =
newatomicinteger(0
);public
static string roundrobin()
思路:建立新list,根據權重值將ip新增到新list中,然後通過簡單輪詢獲取ip。缺點:當權重值過大時,list過大,嚴重消耗記憶體
// 輪詢下標
private
static
int pos =0;
public
static string roundrobin()
}if(pos >= iplist.
size()
) string ip = iplist.
get(pos)
; pos++
;return ip;
}
思路:記錄請求次數,用請求次數模上總權重,然後判斷該值落在座標軸上的哪個範圍
/**
* 請求計數器
*/private
static atomicinteger atomicnum =
newatomicinteger(0
);public
static string roundrobin()
// 獲取請求計數器值
int pos = atomicnum.
getandadd(1
);// 取模
int inx = pos % totalweigh;
// 迴圈判斷,如果餘數小於ip的權重值,就返回ip
for(string ip : map.
keyset()
) inx = inx - weigh;
}return"";
}
思路:引入靜態權重、動態權重概念假設現在有3臺服務:
伺服器 | 權重 | 動態權重
—|--- | —
a | 5 | 0
b | 1 | 0
c | 1 | 0
演算法介紹:
說明演算法公式
1. 計算總權重totalweigh
totalweigh = weigh + … + weigh
2.計算currentweigh值,初始為0
currentweigh = currentweigh + weigh
3.獲取currentweigh最大值
max(currentweigh )
4.返回ip
返回currentweigh最大值對應的服務ip
5.修改最大權重值 currentweigh - 總權重,其它不變
max(currentweigh ) - totalweigh
執行結果:
執行次數
計算currentweigh值
獲取currentweigh最大值
返回ip
修改最大currentweigh
15,1,15a
-2,1,1
23,2,23a
-4,2,2
31,3,33b
1,-4,3
46,-3,46a
-1,-3,4
54,-2,55c
4,-2,-2
69,-1,-19a
2,-1,-1
77,0,07a
0,0,0
/**
* 服務
*/public
class
serverip
}
/**
* 權重物件
*/public
class
weigh
public
void
setip
(string ip)
public integer getweigh()
public
void
setweigh
(integer weigh)
public integer getcurrentweigh()
public
void
setcurrentweigh
(integer currentweigh)
public
weigh
(string ip, integer weigh, integer currentweigh)
public
class
roundrobin);
}// 2、迴圈計算currentweigh值,公式:currentweigh = weigh + currentweigh
for(weigh weigh : weighlist)
// 3、獲取currentweigh最大值
weigh maxweigh = null;
for(weigh weigh : weighlist)
}// 修改最大權重值,公式:currentweigh - 總權重
maxweigh.
setcurrentweigh
(maxweigh.
getcurrentweigh()
- totalweigh)
;return maxweigh.
getip()
;}}
常見負載均衡演算法
隨著系統日益龐大 邏輯業務越來越複雜,系統架構由原來的單一系統到垂直系統,發展到現在的分布式系統。分布式系統中,可以做到公共業務模組的高可用,高容錯性,高擴充套件性,然而,當系統越來越複雜時,需要考慮的東西自然也越來越多,要求也越來越高,比如服務路由 負載均衡等。此文將針對負載均衡演算法進行講解,不...
常見負載均衡演算法
輪詢很容易實現,將請求按順序輪流分配到後台伺服器上,均衡的對待每一台伺服器,而不關心伺服器實際的連線數和當前的系統負載。這裡通過例項化乙個serviceweightmap的map變數來伺服器位址和權重的對映,以此來模擬輪詢演算法的實現,其中設定的權重值在以後的加權演算法中會使用到,這裡先不做過多介紹...
常見負載均衡演算法
輪詢法是負載均衡中最常用的演算法,它容易理解也容易實現。輪詢法是指負載均衡伺服器 load balancer 將客戶端請求按順序輪流分配到後端伺服器上,以達到負載均衡的目的。假設現在有6個客戶端請求,2台後端伺服器。當第乙個請求到達負載均衡伺服器時,負載均衡伺服器會將這個請求分派到後端伺服器1 當第...