日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RabbitMQ负载均衡(1)

發布時間:2024/4/11 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RabbitMQ负载均衡(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。

歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/rabbitmq-load-balance-1/


面對大量業務訪問、高并發請求可以使用高性能的服務器來提升RabbitMQ服務的負載能力。當單機容量達到極限時,我們可以采取集群的策略來對負載能力做進一步的提升,但是這里還存在一個負載不均衡的問題。試想如果一個集群中有3個節點,那么所有的客戶端都與其中的單個節點node1建立TCP連接,那么node1的網絡負載必然會大大增加而顯得難以承受,其他節點又由于沒有那么多的負載而造成硬件資源的浪費,所以負載均衡顯得尤為重要。

負載均衡(Load balance)是一種計算機網絡技術,用于在多個計算機(計算機集群)、網絡連接、CPU、磁盤驅動器或其他資源中分配負載,以達到最佳資源使用、最大化吞吐率、最小響應時間以及避免過載的目的。使用帶有負載均衡的多個服務器組件,取代單一的組件,可以通過冗余提高可靠性。負載均衡通常分為軟件負載均衡和硬件負載均衡兩種。

軟件負載均衡是指在一個或者多個交互的網絡系統中的多臺放服務器上安裝一個或多個相應的負載均衡軟件來實現一種均衡負載技術。軟件可以很方便的安裝在服務器上,并且實現一定的均衡負載功能。軟件負載均衡技術配置簡單、操作也仿版,最重要的是成本很低。

硬件負載均衡是指在多臺服務器間安裝相應的負載均衡設備,也就是負載均衡器(如F5)來完成均衡負載技術,與軟件負載均衡技術相比,能達到更好的負載均衡效果。由于硬件負載均衡技術需要額外的增加負載均衡器,成本比較高,所以適用于流量高的大型網站系統。

這里主要討論的是如何有效的對RabbitMQ集群使用軟件負載均衡技術,目前主流的方式有在客戶端內部實現負載均衡,或者使用HAProxy、LVS等負載均衡軟件來實現。

客戶端內部實現負載均衡

對于RabbitMQ而言可以在客戶端連接時簡單的使用負載均衡算法來實現負載均衡。負載均衡算法有很多種,主流的有:

輪詢法
將請求按順序輪流地分配到后端服務器上,它均衡地對待后端的每一臺服務器,而不關系服務器實際的連接數和當前的系統負載。
示例如代碼清單所示,如果多個客戶端需要連接到這個有3個節點的RabbitMQ集群,可以調用RoundRobin.getConnectionAddress()來獲取相應的連接地址。

public class RoundRobin {private static List<String> list = new ArrayList<String>(){{add("192.168.0.2");add("192.168.0.3");add("192.168.0.4");}};private static int pos = 0;private static final Object lock = new Object();public static String getConnectionAddress(){String ip = null;synchronized (lock) {ip = list.get(pos);if (++pos >= list.size()) {pos = 0;}}return ip;} }

隨機法
通過隨機算法,根據后端服務器的列表大小值來隨機選取其中的一臺服務器進行訪問。由概率統計理論可以得知,隨著客戶端調用服務端的次數增多,其實際效果越來越接近于平均分配調用量到后端的每一臺服務器,也就是輪詢的結果。對應的示例代碼如下:

public class RandomAccess {private static List<String> list = new ArrayList<String>(){{add("192.168.0.2");add("192.168.0.3");add("192.168.0.4");}};public static String getConnectionAddress(){Random random = new Random();int pos = random.nextInt(list.size());return list.get(pos);} }

源地址哈希法
源地址哈希的思想是根據獲取的客戶端IP地址,通過哈希函數計算得到的一個數值,用該數值對服務器列表的大小進行取模運算,得到的結果便是客戶端要訪問服務器的序號。采用源地址哈希法進行負載均衡,同一IP地址的客戶端,當后端服務器列表不變時,它每次都會映射到同一臺后端服務器進行訪問。

public class IpHash {private static List<String> list = new ArrayList<String>(){{add("192.168.0.2"); add("192.168.0.3"); add("192.168.0.4");}};public static String getConnectionAddress() throws UnknownHostException {int ipHashCode = InetAddress.getLocalHost().getHostAddress().hashCode();int pos = ipHashCode % list.size();return list.get(pos);} }

加權輪詢法
不同的后端服務器可能機器的配置和當前系統的負載并不相同,因此它們的抗壓能力也不相同。給配置高、負載低的機器配置更高的權重,讓其處理更多的請求;而配置低、負載高的集群,給其分配較低的權重,降低其系統負載,加權輪詢能很好地處理這一問題,并將請求順序且按照權重分配到后端。

加權隨機法
與加權輪詢法一樣,加權隨機法也根據后端機器的配置、系統的負載分配不同權重。不同的是,它是按照權重隨機請求后端服務器,而非順序。

最小連接數法
最小連接數算法比較靈活和智能,由于后端服務器的配置不盡相同,對于請求的處理有塊有慢,它是根據后端服務器當前的連接情況,動態地選取其中當前積壓連接數最少的一臺服務器來處理當前的請求,盡可能地提高后端服務的利用效率,將負載合理地分流到每一臺服務器。

有關于加權輪詢法、加權隨機法和最小連接數法的實現也比較簡單,這里就留給讀者自己動手實踐一下。

歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/rabbitmq-load-balance-1/


歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。


超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的RabbitMQ负载均衡(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。