RabbitMQ集群與負載均衡實戰指南

文章目錄

  • 集群架構
    • 概述
    • 仲裁隊列的使用
      • 1. 使用Spring框架代碼創建
      • 2. 使用amqp-client創建
      • 3. 使用管理平臺創建
  • 負載均衡
    • 引入HAProxy 負載均衡:
    • 使用方法
      • 1. 修改配置文件
      • 2. 聲明隊列 test_cluster
      • 3. 發送消息

集群架構

概述

RabbitMQ支持部署多個結點,每個結點存儲相同的數據,本質上沒有區別。用戶可以訪問任意一個結點,其響應結果是一致的。每個結點都包含多個隊列,隊列的類型有很多,本博客主要探討經典隊列(Classic)和仲裁隊列(Quorum)。不論什么類型的隊列,都會存儲兩類消息:

  • 元數據:隊列名稱、交換機信息、綁定等
  • 消息數據:隊列中存儲的實際消息。

1. 經典隊列(Classic Queues)

  • 特點
    • 元數據在集群所有節點共享,消息默認存儲在主節點因此如果某個結點一旦宕機,對應存儲的消息數據在該集群中將會丟失
    • 支持持久化(Durable)和非持久化。
    • 一致性較弱(最終一致性),性能高,靈活性強。
    • 適合通用場景,如任務分發、日志收集。

2. 仲裁隊列(Quorum Queues)

  • 特點
    • 基于Raft 共識算法的高可用隊列,消息數據會同步到集群中的其他節點,即使某個結點宕機,也能夠保證集群的數據一致性。

    • 性能開銷較高,不支持部分經典隊列功能(如優先級)。

    • 適合對一致性要求高的場景,如金融交易、訂單處理。

Raft 共識算法,這里用動畫的方式形象的闡釋了Raft保證數據一致性的執行流程,所以小編在這里偷個懶。

仲裁隊列的使用

仲裁隊列(Quorum Queue)是RabbitMQ中的一種高可用隊列,它能夠在節點故障時繼續提供服務。以下是創建仲裁隊列的三種方式:

1. 使用Spring框架代碼創建

通過Spring的注解和配置,可以方便地創建仲裁隊列。


@Configuration
public class QuorumConfig {@Bean("quorumQueue")public Queue quorumQueue() {return QueueBuilder.durable("quorum_queue").quorum().build();}
}

2. 使用amqp-client創建

通過Java代碼直接使用amqp-client庫來創建仲裁隊列。


public class QuorumProducer {public static void main(String[] args) throws IOException {ConnectionFactory factory = new ConnectionFactory();factory.setHost("127.0.0.1");factory.setPort(5672);factory.setUsername("guest");factory.setPassword("guest");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {Map<String, Object> param = new HashMap<>();param.put("x-queue-type", "quorum");channel.queueDeclare("quorum_queue", true, false, false, param);}}
}

3. 使用管理平臺創建

通過RabbitMQ的管理平臺,可以圖形化地創建仲裁隊列。


負載均衡

雖然RabbitMQ支持集群部署,看似好像提升了流量的承載力。但是如果請求只發送給一個或者那幾個負載過高的結點,羊毛一直往一處薅,這個結點一旦掛掉,那么用戶無法訪問了!

解決辦法——

引入HAProxy 負載均衡:

在這里插入圖片描述

它和我們之前在Spirng中學的LoadBalence類似會把請求路由到正常的結點,并且個可以設定路由策略,充分利用每一個結點資源。

使用方法

在現代微服務架構中,負載均衡是確保服務高可用性和性能的關鍵技術之一。本文將介紹如何使用RabbitMQ實現負載均衡,并通過示例代碼展示其具體實現步驟。

1. 修改配置文件

首先,需要修改RabbitMQ的配置文件,將HAProxy的IP和端口設置為RabbitMQ的綁定地址。

spring:rabbitmq:addresses: amqp://study:study@124.71.229.73:15670/test

2. 聲明隊列 test_cluster

在Spring Boot應用中,我們需要聲明一個隊列,用于負載均衡。


@Configuration
public class ClusterConfig {@Bean("ClusterQueue")public Queue clusterQueue() {return QueueBuilder.durable(Constant.CLUSTER_QUEUE).quorum().build();}
}

3. 發送消息

接下來,我們可以通過控制器發送消息到聲明的隊列。


@RestController
@RequestMapping("/cluster")
public class ClusterController {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMappingpublic String cluster() {rabbitTemplate.convertAndSend("", Constant.CLUSTER_QUEUE, "quorum test...");return "發送成功!";}
}

或者使用amqp客戶端發送消息:


public class ClusterProducer {private static final String QUEUE_NAME = "hello_world";public static void main(String[] args) throws IOException, TimeoutException {// 1. 創建連接工廠ConnectionFactory factory = new ConnectionFactory();// 2. 設置參數factory.setHost("124.71.229.73"); // HAProxy 地址factory.setPort(5670); // HAProxy 端口factory.setUsername("host"); // 用戶名,默認factory.setPassword("study"); // 密碼,默認// 3. 創建連接connectionConnection connection = factory.newConnection();// 4. 創建channel通道Channel channel = connection.createChannel();// 5. 聲明隊列Map<String, Object> param = new HashMap<>();param.put("x-queue-type", "quorum");channel.queueDeclare("test_cluster", true, false, false, param);// 6. 通過channel發送消息到隊列中String msg = "hello cluster...";// 簡單模式下,使用的是默認交換機,使用默認交換機時,routingKey要和隊列名稱一致,才可以路由到對應的隊列中去channel.basicPublish("", "test_cluster", null, msg.getBytes());// 7. 釋放資源System.out.println("消息發送成功!");connection.close();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85439.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85439.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85439.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Prometheus + Grafana + Cadvisor:構建高效企業級服務監控體系

在現代軟件開發和運維領域&#xff0c;容器化技術的應用越來越廣泛&#xff0c;其中 Docker 作為最受歡迎的容器化解決方案之一&#xff0c;其容器的監控管理變得至關重要。本文將詳細介紹如何使用 cadvisor、Prometheus 和 Grafana 來監控 Docker 容器的狀態。 一、安裝鏡像 …

小提琴圖繪制-Graph prism

在 GraphPad Prism 中為小提琴圖添加顯著性標記(如*P<0.05)的步驟如下: 步驟1:完成統計檢驗 選擇數據表:確保數據已按分組排列(如A列=Group1,B列=Group2)。執行統計檢驗: 點擊工具欄 Analyze → Column analyses → Mann-Whitney test(非參數檢驗,適用于非正態數…

【開源工具】跳過網頁APP禁止粘貼限制:自動輸入鍵盤模擬工具

&#x1f4cc; 【黑科技】跳過網頁APP禁止粘貼限制&#xff1a;自動輸入鍵盤模擬工具 &#x1f308; 個人主頁&#xff1a;創客白澤 - CSDN博客 &#x1f525; 系列專欄&#xff1a;&#x1f40d;《Python開源項目實戰》 &#x1f4a1; 熱愛不止于代碼&#xff0c;熱情源自每一…

深度學習篇---face-recognition的優劣點

face_recognition庫是一個基于 Python 的開源人臉識別工具&#xff0c;封裝了 dlib 庫的深度學習模型&#xff0c;具有易用性高、集成度強的特點。以下從技術實現、應用場景等維度分析其優劣勢&#xff1a; 一、核心優勢 1. 極簡 API 設計&#xff0c;開發效率極高 代碼量少…

Git深入解析功能邏輯與核心業務場景流程

一、Git核心功能邏輯架構 #mermaid-svg-9tj1iCr99u6QenJM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9tj1iCr99u6QenJM .error-icon{fill:#552222;}#mermaid-svg-9tj1iCr99u6QenJM .error-text{fill:#552222;st…

【大模型】情緒對話模型項目研發

一、使用框架&#xff1a; Qwen大模型后端Open-webui前端實現使用LLamaFactory的STF微調數據集&#xff0c;vllm后端部署&#xff0c; 二、框架安裝 下載千問大模型 安裝魔塔社區庫文件 pip install modelscope Download.py 內容 from modelscope import snapshot_downlo…

Java基礎 Day26

一、網絡編程簡介 1、概念 網絡編程指在網絡通信協議下&#xff0c;不同計算機上運行的程序&#xff0c;進行數據傳輸 2、軟件架構 &#xff08;1&#xff09;CS架構&#xff08;客戶端和服務端&#xff09; 在用戶本地有一個客戶端程序&#xff0c;在遠程有一個服務器端程…

【Hot 100】45. 跳躍游戲 II

目錄 引言跳躍游戲 IIdp解題貪心解題 &#x1f64b;?♂? 作者&#xff1a;海碼007&#x1f4dc; 專欄&#xff1a;算法專欄&#x1f4a5; 標題&#xff1a;【Hot 100】45. 跳躍游戲 II?? 寄語&#xff1a;書到用時方恨少&#xff0c;事非經過不知難&#xff01; 引言 跳躍…

計算機網絡第1章(上):網絡組成與三種交換方式全解析

目錄 一、計算機網絡的概念二、計算機網絡的組成和功能2.1 計算機網絡的組成2.2 計算機網絡的功能 三、電路交換、報文交換、分組交換3.1 電路交換&#xff08;Circuit Switching&#xff09;3.2 報文交換&#xff08;Message Switching&#xff09;3.3 分組交換&#xff08;Pa…

[總結]前端性能指標分析、性能監控與分析、Lighthouse性能評分分析

前端性能分析大全 前端性能優化 LightHouse性能評分 性能指標監控分析 瀏覽器加載資源的全過程性能指標分析 性能指標 在實現性能監控前&#xff0c;先了解Web Vitals涉及的常見的性能指標 Web Vitals 是由 Google 推出的網頁用戶體驗衡量指標體系&#xff0c;旨在幫助開發者量…

Windows商店中的免費掃雷游戲應用

《掃雷》是一款經典的單人益智小游戲&#xff0c;1992年微軟發布的Windows 3.1中加入該游戲&#xff0c;從此風靡全世界。游戲目標是通過邏輯推理&#xff0c;在最短的時間內根據點擊格子出現的數字找出所有非雷格子&#xff0c;同時避免踩雷。 此Windows應用實現了經典掃雷的…

ActiveMQ 可觀測性最佳實踐

ActiveMQ 介紹 ActiveMQ 是一款高性能、開源的消息中間件&#xff0c;支持多種消息協議&#xff08;如 JMS、AMQP、MQTT 等&#xff09;&#xff0c;能夠實現應用程序之間的異步通信和消息傳遞。它提供點對點&#xff08;Queue&#xff09;和發布/訂閱&#xff08;Topic&#…

【Linux命令】scp遠程拷貝

文章目錄 1. 基本語法與常用選項2. 使用場景和使用示例本地文件->遠程主機遠程主機文件->本地遠程主機->另一臺遠程主機 3. 使用注意事項 scp&#xff08;Secure Copy Protocol&#xff09;是linux中基于ssh的安全文件傳輸工具&#xff0c;用于在本地和遠程主機之前安…

如何優化 Harmony-Cordova 應用的性能?

以下是針對 ?Harmony-Cordova 應用性能優化?的完整方案&#xff0c;結合鴻蒙原生特性和Cordova框架優化策略&#xff1a; ??一、渲染性能優化? ?減少布局嵌套層級? 使用扁平化布局&#xff08;如 Grid、GridRow&#xff09;替代多層 Column/Row 嵌套&#xff0c;避免冗…

c++學習之---模版

目錄 一、函數模板&#xff1a; 1、基本定義格式&#xff1a; 2、模版函數的優先匹配原則&#xff1a; 二、類模板&#xff1a; 1、基本定義格式&#xff1a; 2、類模版的優先匹配原則&#xff08;有坑哦&#xff09;&#xff1a; 3、缺省值的設置&#xff1a; 4、ty…

SpringAI(GA):RAG下的ETL快速上手

原文鏈接&#xff1a;SpringAI(GA)&#xff1a;RAG下的ETL快速上手 教程說明 說明&#xff1a;本教程將采用2025年5月20日正式的GA版&#xff0c;給出如下內容 核心功能模塊的快速上手教程核心功能模塊的源碼級解讀Spring ai alibaba增強的快速上手教程 源碼級解讀 版本&a…

用dayjs解析時間戳,我被提了bug

引言 前幾天開發中突然接到測試提的一個 Bug&#xff0c;說我的時間組件顯示異常。 我很詫異&#xff0c;這里初始化數據是后端返回的&#xff0c;我什么也沒改&#xff0c;這bug提給我干啥。我去問后端&#xff1a;“這數據是不是有問題&#xff1f;”。后端答&#xff1a;“…

DataAgent產品經理(數據智能方向)

DataAgent產品經理&#xff08;數據智能方向&#xff09; 一、核心崗位職責 AI智能體解決方案設計 面向工業/政務場景構建「數據-模型-交互」閉環&#xff0c;需整合多源異構數據&#xff08;如傳感器數據、業務系統日志&#xff09;與AI能力&#xff08;如大模型微調、知識圖…

Ubuntu取消開機用戶自動登錄

注&#xff1a;配置前請先設置登錄密碼&#xff0c;不同顯示管理器配置方法不同&#xff0c;可用命令查看&#xff1a;cat /etc/X11/default-display-manager 一、LightDM 顯示管理器&#xff0c;關閉 Ubuntu 系統用戶自動登錄 查找自動登錄配置文件&#xff0c;可以看到類似 a…

使用lighttpd和開發板進行交互

文章目錄 &#x1f9e0; 一、Lighttpd 與開發板的交互原理1. 什么是 Lighttpd&#xff1f;2. 與開發板交互的方式&#xff1f; &#x1f9fe; 二、lighttpd.conf 配置文件講解?? 注意事項&#xff1a; &#x1f4c1; 三、目錄結構說明&#x1f4a1; 四、使用 C 編寫 CGI 腳本…