負載均衡演算法之輪詢

2022-07-25 05:03:07 字數 2622 閱讀 4959

最近的工作事情比較少,於是就開是瞎折騰了

負載均衡大家一定不陌生了,一句話就是,人人有飯吃,還吃得飽,它的核心關鍵字就在於均衡,關於負載均衡大家基本可以脫口而出常見的幾種,輪詢,隨機,雜湊,帶權值的輪詢,客戶端請求數等等

作為最簡單的一種負載均衡策略,輪詢的優點顯而易見,簡單,並且在多數的情況是,基本適用(一般部署的線上集群機器,大部分的配置都比較相近,差距不會那麼大,因此使用輪詢是一種可以接受的方案)

輪詢的實現簡單來說就是從乙個「迴圈列表」中不斷的獲取,這裡的列表可以是陣列,也可以是鍊錶,也可以是map的key集合,簡而言之,就是一維陣列型別。

這裡我簡單的做了三種輪詢的實現,分別是基於 atomic包的實現,synchronized同步,以及blockingqueue

atomic包內的類是基於cas來實現值的同步,因此可以利用這一點來做輪詢,測試**如下

private listlist = lists.newarraylist(1, 2, 3, 4, 5, 6);

@test

public void test()

try catch (interruptedexception e)

system.out.println("costs = " + (system.currenttimemillis() - now));

} private class task implements runnable

@override

public void run()

} finally

}}

同步是我們最容易想到的方式了

private linkedlistlinkedlist  = new linkedlist<>();

private final object mutex = new object();

@test

public void testsync()

try catch (interruptedexception e)

system.out.println("costs = " + (system.currenttimemillis() - now));

}private class tasksync implements runnable

public void run()

}} finally

}}

concurrent包中有很多為我們封裝了底層細節的包,可以直接進行使用,其中就包含了阻塞佇列,阻塞佇列許多的操作都是執行緒安全的。

private arrayblockingqueuequeue = new arrayblockingqueue<>(16);

@test

public void testblocking() throws interruptedexception

try catch (interruptedexception e)

system.out.println("costs = " + (system.currenttimemillis() - now));

}private class taskblocking implements runnable

@override

public void run()

"【thread - %d】 get=%d\n", tid, idx);

queue.add(idx);

}} finally

}}

本人機器,win10系統,cpu4核

併發數迴圈次數(萬次)

耗時(s)410

0.08810

0.12

1610

0.135

3210

0.16

41000

1.18

1000

2.216

1000

4.432

1000

9.5併發數

迴圈次數(萬次)

耗時(s)410

0.203810

0.243

1610

0.339

3210

0.996

41000

3.78

1000

7.116

1000

14.4

321000

26.4

併發數迴圈次數(萬次)

耗時(s)410

0.138810

0.216

100.381

3210

0.769

4100048

1000

7.916

1000

20.3

321000

74.8

從耗時的結果上來看,atomic是最快的一種實現,blocking最慢(blocking的取和存,在源**中都有使用到reentrantlock,因此一次run()需要2次鎖的獲取),而synchronized會比阻塞佇列的方式稍微好點

好了,以上是我對輪詢的一點小探索,如果您覺得有**不正確或有其他建議的地方,歡迎拍磚

ribbon負載均衡之輪詢演算法

最近在看spring cloud相關模組原始碼,剛好看到了ribbon負載均衡的各種策略實現,今天我們看下輪詢演算法是如何實現的。talk is cheap.show me the code.public class roundrobintest public static void main st...

負載均衡演算法 加權輪詢

輪詢演算法沒有考慮每台伺服器的處理能力,實際情況是每台伺服器的配置 安裝的業務應用等不同,其處理能力會不一樣。所以,加權輪詢演算法的原理就是 根據伺服器的不同處理能力,給每個伺服器分配不同的權值,使其能接受相應權值數的服務請求。首先看乙個簡單的nginx負載均衡配置。按照上述配置,nginx每收到7...

負載均衡手段之DNS輪詢

大多數網域名稱註冊商都支援對統一主機新增多條a記錄,這就是dns輪詢,dns伺服器將解析請求按照a記錄的順序,隨機分配到不同的ip上,這樣就完成了簡單的負載均衡。dns由於成本較低,所以一般在小型的 用的比較多。但是大型的 一般也會將用它和其他負載均衡的方式結合起來一起使用,dns輪詢方式提供的ip...