Java中的權(quán)重算法(如Dubbo的負(fù)載均衡權(quán)重)詳解
負(fù)載均衡
首先了解一下負(fù)載均衡。
百度百科:
負(fù)載均衡,英文名稱為Load Balance,其含義就是指將負(fù)載(工作任務(wù))進(jìn)行平衡、分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行運(yùn)行,例如FTP服務(wù)器、Web服務(wù)器、企業(yè)核心應(yīng)用服務(wù)器和其它主要任務(wù)服務(wù)器等,從而協(xié)同完成工作任務(wù)。
個(gè)人理解,負(fù)載均衡,顧名思義,就是讓硬件或服務(wù),所受的負(fù)載,盡量均衡一點(diǎn)。
物盡其用,如250G固態(tài)硬盤和1T機(jī)械硬盤。
作為系統(tǒng)盤,則選擇用250G的固態(tài),讀取和寫入的速度塊。
有很多學(xué)習(xí)資源要存,容量較大,那么就會(huì)1T的機(jī)械硬盤。
擇優(yōu)選擇,打疫苗時(shí),A,B,C三個(gè)醫(yī)院,A醫(yī)院爆滿,C醫(yī)院人數(shù)較少,那么就去C醫(yī)院。
Dubbo四種負(fù)載均衡
- 隨機(jī)權(quán)重(Random LoadBalance)
- dubbo默認(rèn) A:權(quán)重40 占比2/5 B:權(quán)重20 占比1/5 C:權(quán)重40 占比2/5 則每次請(qǐng)求,都是隨機(jī)訪問的,可能A,可能B,可能C。數(shù)據(jù)量大的情況下,就會(huì)形成權(quán)重的比例。
- 輪詢(RoundRobin LoadBalance)
- 輪循,按公約后的權(quán)重設(shè)置輪循比率。(可以根據(jù)權(quán)重輪詢,如2/5,1/5,2/5。5個(gè)請(qǐng)求,則 A-B-C-A-C)無權(quán)重則A-B-C-A-B-C.... 存在慢的提供者累積請(qǐng)求的問題,比如:第二臺(tái)機(jī)器很慢,但沒掛,當(dāng)請(qǐng)求調(diào)到第二臺(tái)時(shí)就卡在那,久而久之,所有請(qǐng)求都卡在調(diào)到第二臺(tái)上。
- 最少活躍調(diào)用數(shù)(LeastActive LoadBalance)
- 最少活躍調(diào)用數(shù),相同活躍數(shù)的隨機(jī),活躍數(shù)指調(diào)用前后計(jì)數(shù)差。 使慢的提供者收到更少請(qǐng)求,因?yàn)樵铰奶峁┱叩恼{(diào)用前后計(jì)數(shù)差會(huì)越大。 A:200ms B:200ms C:300ms 先看一下上次調(diào)用時(shí)間,請(qǐng)求優(yōu)先調(diào)用A和B,隨機(jī)選擇。統(tǒng)計(jì)上一次的調(diào)用時(shí)間
- 一致性hash(ConsistentHash LoadBalance)
- 一致性 Hash,相同參數(shù)的請(qǐng)求總是發(fā)到同一提供者。 當(dāng)某一臺(tái)提供者掛時(shí),原本發(fā)往該提供者的請(qǐng)求,基于虛擬節(jié)點(diǎn),平攤到其它提供者,不會(huì)引起劇烈變動(dòng)。 算法參見://en.wikipedia.org/wiki/Consistent_hashing 缺省只對(duì)第一個(gè)參數(shù) Hash,如果要修改,請(qǐng)配置 <dubbo:parameter key="hash.arguments" value="0,1" /> 缺省用 160 份虛擬節(jié)點(diǎn),如果要修改,請(qǐng)配置 <dubbo:parameter key="hash.nodes" value="320" />
方法名,和第一個(gè)參數(shù)名,getUser?id=1,調(diào)用服務(wù)A,則下次同方法同參數(shù),會(huì)繼續(xù)調(diào)用服務(wù)A,除非服務(wù)A掛掉,那么就會(huì)根據(jù)虛擬節(jié)點(diǎn),平攤給其他服務(wù)提供者。算法處理。
個(gè)人理解的權(quán)重算法
/**
* <h3>根據(jù)權(quán)重獲取對(duì)應(yīng)服務(wù),傳入服務(wù):權(quán)重map</h3>
*
* @param map 服務(wù):權(quán)重map
* @return java.lang.String
* @author Hubers
* @date 2021/6/15 16:16
**/
public static String getServerByWeight(Map<String, Integer> map) {
if (map.isEmpty()){
return null;
}
Integer total = 0;
// 計(jì)算所有權(quán)重,如100+200+300=600
for (Integer value : map.values()) {
total += value;
}
Random random = new Random();
// 在權(quán)重范圍內(nèi)隨機(jī),600以內(nèi)隨機(jī)
int nextInt = random.nextInt(total);
// 遍歷所有服務(wù)提供者provide的ip地址
for (String ip : map.keySet()) {
// 取出權(quán)重值
Integer weight = map.get(ip);
// 權(quán)重在范圍內(nèi),則返回對(duì)應(yīng)ip
if (nextInt < weight) {
return ip;
}
// 否則減去權(quán)重,繼續(xù)下一次循環(huán),匹配對(duì)應(yīng)的ip
nextInt -= weight;
}
return null;
}
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("192.168.1.1", 10);
map.put("192.168.1.2", 10);
map.put("192.168.1.3", 10);
map.put("192.168.1.4", 10);
for (int i = 0; i < 10; i++) {
String weight = getServerByWeight(map);
if (Objects.isNull(weight)) {
throw new RuntimeException("無可用服務(wù)");
}
System.out.println(weight);
}
}到此這篇關(guān)于Java中的權(quán)重算法(如Dubbo的負(fù)載均衡權(quán)重)詳解的文章就介紹到這了,更多相關(guān)Java權(quán)重算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring4.3 實(shí)現(xiàn)跨域CORS的方法
下面小編就為大家分享一篇spring4.3 實(shí)現(xiàn)跨域CORS的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
SpringBoot異常處理器的使用與添加員工功能實(shí)現(xiàn)流程介紹
設(shè)計(jì)完了登錄與退出功能還只完成了冰山一角,經(jīng)過測試發(fā)現(xiàn),我們以u(píng)rl的方式來訪問網(wǎng)站時(shí)可以直接跳過登陸頁面進(jìn)入后臺(tái)頁面,這樣顯然是不合理的,下面我們通過異常攔截器+boot來做到訪問限制,以及實(shí)現(xiàn)新增員工功能,制作全局異常處理器2022-10-10
springboot項(xiàng)目事務(wù)標(biāo)簽驗(yàn)證
本文主要介紹了springboot項(xiàng)目事務(wù)標(biāo)簽驗(yàn)證,文中通過示例代碼介紹的非常詳細(xì),詳細(xì)的介紹了不加事務(wù)標(biāo)簽和加事物標(biāo)簽的使用,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07
在Java中實(shí)現(xiàn)CQRS架構(gòu)的全過程
CQRS是Command?Query?Responsibility?Segregation的縮寫,一般稱作命令查詢職責(zé)分離,本文給大家介紹在Java中實(shí)現(xiàn)CQRS架構(gòu)的全過程,感興趣的朋友跟隨小編一起看看吧2026-03-03
在Java中如何決定使用 HashMap 還是 TreeMap
這篇文章主要介紹了在Java中如何決定使用 HashMap 還是 TreeMap,很多朋友對(duì)這樣的問題很迷茫,下面小編給大家?guī)硪黄恼聨椭蠹伊私?,需要的朋友可以參考?/div> 2019-10-10
Springboot jar文件如何打包zip在linux環(huán)境運(yùn)行
這篇文章主要介紹了Springboot jar文件如何打包zip在linux環(huán)境運(yùn)行,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
關(guān)于QueryWrapper高級(jí)使用示例
本文介紹了QueryWrapper的高級(jí)使用方法,包括查詢指定字段、使用MySQL函數(shù)處理字段、設(shè)置查詢限制等,通過select()可查詢指定字段并處理,last()方法實(shí)現(xiàn)limit效果,apply()可在查詢條件中使用函數(shù),這些技巧有助于提升數(shù)據(jù)庫操作的靈活性和效率2024-09-09
SpringBoot?+?Disruptor實(shí)現(xiàn)特快高并發(fā)處理及使用Disruptor高速實(shí)現(xiàn)隊(duì)列的過程
Disruptor是一個(gè)開源的Java框架,它被設(shè)計(jì)用于在生產(chǎn)者—消費(fèi)者(producer-consumer problem,簡稱PCP)問題上獲得盡量高的吞吐量(TPS)和盡量低的延遲,這篇文章主要介紹了SpringBoot?+?Disruptor?實(shí)現(xiàn)特快高并發(fā)處理,使用Disruptor高速實(shí)現(xiàn)隊(duì)列,需要的朋友可以參考下2023-11-11
Map按單個(gè)或多個(gè)Value排序當(dāng)Value相同時(shí)按Key排序
Map可以先按照value進(jìn)行排序,然后按照key進(jìn)行排序。 或者先按照key進(jìn)行排序,然后按照value進(jìn)行排序,這樣操作都行,這篇文章主要介紹了Map按單個(gè)或多個(gè)Value排序,當(dāng)Value相同時(shí)按Key排序,需要的朋友可以參考下2023-02-02最新評(píng)論

