Java中的權(quán)重算法(如Dubbo的負載均衡權(quán)重)詳解
負載均衡
首先了解一下負載均衡。
百度百科:
負載均衡,英文名稱為Load Balance,其含義就是指將負載(工作任務(wù))進行平衡、分攤到多個操作單元上進行運行,例如FTP服務(wù)器、Web服務(wù)器、企業(yè)核心應(yīng)用服務(wù)器和其它主要任務(wù)服務(wù)器等,從而協(xié)同完成工作任務(wù)。
個人理解,負載均衡,顧名思義,就是讓硬件或服務(wù),所受的負載,盡量均衡一點。
物盡其用,如250G固態(tài)硬盤和1T機械硬盤。
作為系統(tǒng)盤,則選擇用250G的固態(tài),讀取和寫入的速度塊。
有很多學(xué)習(xí)資源要存,容量較大,那么就會1T的機械硬盤。
擇優(yōu)選擇,打疫苗時,A,B,C三個醫(yī)院,A醫(yī)院爆滿,C醫(yī)院人數(shù)較少,那么就去C醫(yī)院。
Dubbo四種負載均衡
- 隨機權(quán)重(Random LoadBalance)
- dubbo默認 A:權(quán)重40 占比2/5 B:權(quán)重20 占比1/5 C:權(quán)重40 占比2/5 則每次請求,都是隨機訪問的,可能A,可能B,可能C。數(shù)據(jù)量大的情況下,就會形成權(quán)重的比例。
- 輪詢(RoundRobin LoadBalance)
- 輪循,按公約后的權(quán)重設(shè)置輪循比率。(可以根據(jù)權(quán)重輪詢,如2/5,1/5,2/5。5個請求,則 A-B-C-A-C)無權(quán)重則A-B-C-A-B-C.... 存在慢的提供者累積請求的問題,比如:第二臺機器很慢,但沒掛,當(dāng)請求調(diào)到第二臺時就卡在那,久而久之,所有請求都卡在調(diào)到第二臺上。
- 最少活躍調(diào)用數(shù)(LeastActive LoadBalance)
- 最少活躍調(diào)用數(shù),相同活躍數(shù)的隨機,活躍數(shù)指調(diào)用前后計數(shù)差。 使慢的提供者收到更少請求,因為越慢的提供者的調(diào)用前后計數(shù)差會越大。 A:200ms B:200ms C:300ms 先看一下上次調(diào)用時間,請求優(yōu)先調(diào)用A和B,隨機選擇。統(tǒng)計上一次的調(diào)用時間
- 一致性hash(ConsistentHash LoadBalance)
- 一致性 Hash,相同參數(shù)的請求總是發(fā)到同一提供者。 當(dāng)某一臺提供者掛時,原本發(fā)往該提供者的請求,基于虛擬節(jié)點,平攤到其它提供者,不會引起劇烈變動。 算法參見://en.wikipedia.org/wiki/Consistent_hashing 缺省只對第一個參數(shù) Hash,如果要修改,請配置 <dubbo:parameter key="hash.arguments" value="0,1" /> 缺省用 160 份虛擬節(jié)點,如果要修改,請配置 <dubbo:parameter key="hash.nodes" value="320" />
方法名,和第一個參數(shù)名,getUser?id=1,調(diào)用服務(wù)A,則下次同方法同參數(shù),會繼續(xù)調(diào)用服務(wù)A,除非服務(wù)A掛掉,那么就會根據(jù)虛擬節(jié)點,平攤給其他服務(wù)提供者。算法處理。
個人理解的權(quán)重算法
/** * <h3>根據(jù)權(quán)重獲取對應(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; // 計算所有權(quán)重,如100+200+300=600 for (Integer value : map.values()) { total += value; } Random random = new Random(); // 在權(quán)重范圍內(nèi)隨機,600以內(nèi)隨機 int nextInt = random.nextInt(total); // 遍歷所有服務(wù)提供者provide的ip地址 for (String ip : map.keySet()) { // 取出權(quán)重值 Integer weight = map.get(ip); // 權(quán)重在范圍內(nèi),則返回對應(yīng)ip if (nextInt < weight) { return ip; } // 否則減去權(quán)重,繼續(xù)下一次循環(huán),匹配對應(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的負載均衡權(quán)重)詳解的文章就介紹到這了,更多相關(guān)Java權(quán)重算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用IntelliJ IDEA2020.2.2 x64 新建java項目并且輸出Hello World
這篇文章主要介紹了使用IntelliJ IDEA2020.2.2 x64 新建java項目并且輸出Hello World,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Java中數(shù)組array和列表list相互轉(zhuǎn)換
這篇文章主要介紹了Java中數(shù)組array和列表list相互轉(zhuǎn)換,在Java中,可以將數(shù)組(array)和列表(list)相互轉(zhuǎn)換,但需要注意一些細節(jié)和限制,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-09-09java網(wǎng)絡(luò)編程基礎(chǔ)知識介紹
這篇文章主要介紹了java網(wǎng)絡(luò)編程基礎(chǔ)知識介紹,涉及OSI分層模型和TCP/IP分層模型的對應(yīng)關(guān)系、IP地址、端口號、tcp、udp等相關(guān)內(nèi)容,還是比較不錯的,這里分享給大家,供需要的朋友參考。2017-11-11優(yōu)化Java虛擬機總結(jié)(jvm調(diào)優(yōu))
這篇文章主要介紹了優(yōu)化Java虛擬機總結(jié)(jvm調(diào)優(yōu)),具有一定借鑒價值,需要的朋友可以參考下2018-01-01SpringBoot+MDC實現(xiàn)鏈路調(diào)用日志的方法
MDC是 log4j 、logback及l(fā)og4j2 提供的一種方便在多線程條件下記錄日志的功能,這篇文章主要介紹了SpringBoot+MDC實現(xiàn)鏈路調(diào)用日志,需要的朋友可以參考下2022-12-12