RabbitMQ—仲裁隊列

上篇文章:

RabbitMQ集群搭建https://blog.csdn.net/sniper_fandc/article/details/149312481?fromshare=blogdetail&sharetype=blogdetail&sharerId=149312481&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

目錄

1 Raft一致性算法

1.1 角色劃分和相關名詞

1.2 Leader選舉

1.3 日志復制

2 仲裁隊列使用

2.1 配置文件

2.2 聲明仲裁隊列

2.3 生產者

2.4 演示仲裁隊列的復制


????????仲裁隊列是基于Raft一致性算法實現的隊列。其主要作用是提供復制能力,向其它節點復制消息從而保證集群的高可用性。要介紹仲裁隊列首先就需要了解Raft算法:

1 Raft一致性算法

????????Raft一致性算法是一種通過投票選擇主節點來保證節點之間達成共識的算法。通過選舉Leader(主節點),由Leader和客戶端進行交互,負責把客戶端的操作打包成日志然后把日志同步給其它從節點(日志復制),只有大部分從節點都成功同步并返回確認主節點才會認為此次操作成功。

????????關于Raft算法的具體細節見原文:

https://web.stanford.edu/~ouster/cgi-bin/papers/raft-atc14

1.1 角色劃分和相關名詞

????????Raft算法共有三種角色:

????????Leader(領導者):Leader就相當于主節點,負責和客戶端交互和日志復制,并且定期向所有Follower發送心跳包,防止Follower以為Leader掛掉而進入選舉Leader的流程。

????????Follower(跟隨者):Follower相當于從節點,接受來自Leader的日志并同步到本地,作用就是集群的副本。

????????Candidate(候選人):當Follower一段時間內接收不到Leader的心跳包(認為其掛掉了),就會出發選舉Leader的流程,此時Follower變為Candidate。

????????在三種角色的劃分下,整個集群的工作時間被劃分為兩個部分:選舉期(election)和任期(term)選舉期就是進行Leader選舉時間的投票時期,Leader選舉成功后就會進入term,任期就是集群正常工作的時期

????????term長度任意長(如果某次選舉期沒有選出Leader就認為該term長度為0,即沒有任期)。每個節點內部都記錄著current term(當前任期號,單調遞增),節點之間通信時會攜帶該任期號,當節點任期號小于通信節點的任期號,就會把當前任期號改為較大值。Candidate(可能沒有競爭過其它Candidate)或Leader(可能之前宕機后恢復或者Leader網絡恢復正常)如果接收到新Leader的心跳包,就會發現自己已經的term已經過期了,就會恢復Follower角色并修改任期號為最新值

????????節點之間采用RPC通信,有兩種類型的請求:

????????RequestVote RPCs:請求投票,Candidate在選舉過程中發出。

????????AppendEntries RPCs:追加條,Leader發出的日志復制和心跳機制。

1.2 Leader選舉

????????Leader選舉有三條規則:

????????1.每個節點只有一票;

????????2.Candidate超過半數節點投票就會選舉為Leader;

????????3.投票按照先來先到原則進行投。

????????而觸發選舉有兩個時機,一是集群啟動的初始時刻,此時沒有Leader,率先超過心跳包過期時間的進入Candidate發起投票。二是其它節點沒有及時接受到心跳包(故障或網絡問題),先發現問題的先進入Candidate發起投票。因此假設集群有5個節點,Leader選舉流程如下:

????????初始情況下,集群沒有Leader,節點外圈的環形進度條表示超時時間。S3節點會率先超時成為Candidate。

????????S3成為Candidate后發起投票,并先給自己投了一票,上圖綠色的則是請求投票的數據包(RequestVote RPCs)。

????????其它節點接受到投票請求后把各自唯一一票投給S3,于是S3接收到5票(超過半數投票),因此成為Leader。

????????S3成為Leader后向其它節點告知新的Leader的信息,發送心跳包(AppendEntries RPCs),如上圖黃色數據包。待接受其它節點的響應后,便開始正常的工作流程,如與客戶端交互、日志復制等,在任期期間,S3會不斷向Follower發送心跳包維持Leader任期。

????????對于Candidate除了成為Leader,還可能出現其它兩種情況:一是其它節點成為Leader;二是多個Candidate平票,無法選出Leader。

????????假設發生其它節點成為Leader:

????????S3先成為Candidate,S1后成為Candidate,因此S3獲得3票,S1只獲得2票,于是S3成為Leader。S3成為新Leader后向所有節點發送心跳包,此時S1處于Candidate狀態接收到心跳包后得知S3的term高于自己,說明已經有新Leader,于是變為Follower,開始正常工作。

????????假設發生多個Candidate平票:

????????這種情況常發生在偶數個節點參與投票,并且有多個Follower同時成為Candidate的時機。比如S1和S3同時成為Candidate,并各自收到其它節點1票和自己的一票,平票狀態無法選出Leader,因此會進行下一輪投票。

????????但是如果由于同時成為Candidate很有可能結束投票的時間也一致,因此下一輪還可能同時成為Candidate并平票。因此Raft算法采用隨機選舉超時時間:每個Candidate的投票期的時間在一個區間內隨機生成,保證各個Candidate的選舉時間不一樣,因此就很難出現同時選舉并平票的情況。

1.3 日志復制

????????成為Leader的節點負責和客戶端進行通信,其它節點作為副本。Leader把和客戶端的交互的消息打包成日志,并同步給其它節點。只有其它節點超過半數(同步較慢的節點并不影響整個集群的性能)都把消息同步到本地,并返回確認,Leader節點才會認為此次操作成功。

????????而仲裁隊列就是上述Raft算法運行的集群上的隊列,每個仲裁隊列有一個主和多個從副本,主副本在主節點(創建仲裁隊列的節點是主節點)上,從副本在從節點上。由主副本把消費復制到從副本上,當主副本掛掉從副本就會參與選舉Leader成為新的主副本進行工作。

2 仲裁隊列使用

????????這里使用SpringBoot來創建和使用仲裁隊列:

2.1 配置文件

spring:rabbitmq:addresses: amqp://admin:admin@192.168.159.150:5673/testVirtual

2.2 聲明仲裁隊列

public class RabbitMQConnection {public static final String QUORUM_QUEUE = "quorum.queue";}
@Configurationpublic class RabbitMQConfig {@Bean("quorumQueue")public Queue quorumQueue(){return QueueBuilder.durable(RabbitMQConnection.QUORUM_QUEUE).quorum().build();}}

2.3 生產者

@RestController@RequestMapping("/producer")public class ProducerController {@Resource(name = "rabbitTemplate")private RabbitTemplate rabbitTemplate;@RequestMapping("quorum")public String quorum() {rabbitTemplate.convertAndSend("", RabbitMQConnection.QUORUM_QUEUE, "Hello SpringBoot RabbitMQ");return "發送成功";}}

2.4 演示仲裁隊列的復制

????????仲裁隊列所在的主副本在rabbitmq1節點上,管理界面登錄的是rabbit節點,可以發現,我們向rabbitmq1的仲裁隊列上發送消息,成功發送:

????????上述+2表示還有2個副本。仲裁隊列副本默認有5個,1主4從副本。當集群中節點的個數小于5個,比如4個節點,則1主3從副本;當集群中節點數大于五個,比如6個節點,則默認只有5個副本,1主4從副本,從副本隨機分配在除主節點外的其它5個節點上(有一個節點會沒有從副本)。

????????當rabbitmq1節點宕機時,如果是普通隊列,所有節點上的消息都會消失,而仲裁隊列其它節點消息還會存在:

????????可以發現,在rabbitmq1宕機后,發生選舉rabbitmq2成為新的Leader,而rabbit還是Follower。

下篇文章:

RabbitMQ—HAProxy負載均衡https://blog.csdn.net/sniper_fandc/article/details/149312701?fromshare=blogdetail&sharetype=blogdetail&sharerId=149312701&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

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

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

相關文章

[2025CVPR-目標檢測方向] CorrBEV:多視圖3D物體檢測

1. ?研究背景與動機? 論文關注自動駕駛中相機僅有的多視圖3D物體檢測(camera-only multi-view 3D object detection)問題。盡管基于鳥瞰圖(BEV)的建模近年來取得顯著進展(如BEVFormer和SparseBEV等基準模型&#xf…

oracle 數據庫批量變更數據 將a表字段批量更新為b表字段

需求:將excel表中的數據批量更新到 taccoinfo表中vc_broker字段0、備份:create table taccoinfo0724 as select vc_custno ,vc_broker from taccoinfo 1、創建臨時表: create table taccoinfo0724_1 as select vc_custno ,vc_broker from…

vim-xcode 項目常見問題解決方案

vim-xcode 項目常見問題解決方案 項目基礎介紹 vim-xcode 是一個開源項目,旨在通過 Vim 編輯器與 Xcode 項目進行交互。該項目允許開發者在 Vim 中直接構建、測試和運行 Xcode 項目,從而提高開發效率。vim-xcode 主要使用 Vimscript 編寫,并依…

個性化網頁計數器

需要一個服務器環境來存放我們的計數器腳本和數據庫。對于初學者來說,PHP和MySQL是一個不錯的組合,因為它們易于學習且廣泛應用。接下來,我們開始編寫PHP腳本。這個腳本的主要任務是接收來自網頁的請求,并將訪問信息存儲到數據庫中…

詳解力扣高頻SQL50題之1683. 無效的推文【入門】

傳送門:1683. 無效的推文 題目 表:Tweets ----------------------- | Column Name | Type | ----------------------- | tweet_id | int | | content | varchar | ----------------------- 在 SQL 中,tweet_id 是這個表的主鍵。 content 只…

Spring Boot與Python的聯動:實戰案例解析

目錄一、背景與需求二、技術準備2.1 Spring Boot 基礎2.2 Python 環境搭建三、基于 RESTful API 的調用3.1 創建 Python Flask 應用3.2 創建 Spring Boot 應用3.3 測試與驗證四、通過 ProcessBuilder 調用 Python 腳本4.1 創建 Python 腳本4.2 Spring Boot 中調用腳本4.3 注意事…

力扣刷題(第九十七天)

靈感來源 - 保持更新,努力學習- python腳本學習密鑰格式化解題思路移除原字符串中的所有破折號,并將小寫字母轉換為大寫。從后向前遍歷處理后的字符串,每 K 個字符為一組。最后將各組逆序拼接,并用破折號分隔。class Solution:def…

ESP32入門實戰:PC遠程控制LED燈完整指南

引言:物聯網遠程控制基礎 遠程控制是物聯網應用的基礎功能之一,通過ESP32實現PC遠程控制LED燈不僅是一個經典入門項目,更是理解網絡通信、嵌入式開發和物聯網交互的絕佳實踐。本文將詳細介紹如何通過WiFi和UDP協議,從零開始構建一…

主流攝像頭協議及其開源情況,GB/T 28181協議介紹

一、主流攝像頭協議及開源情況 1. RTSP(Real Time Streaming Protocol) 技術特性:基于TCP/UDP的實時流傳輸協議,支持雙向通信(如暫停、播放控制)。應用場景:攝像頭實時監控、視頻點播系統。開源…

「iOS」——RunLoop學習

底層學習iOS--RunLoop學習RunLoop的概念RunLoop與線程的關系RunLoop的結構ModeObserverTimerSourceRunLoop 執行流程RunLoop 的應用1.AutoreleasePool是什么時候釋放的2.觸控事件的響應3.刷新界面4.線程保活小知識mach Port**Toll-Free Bridging(對象橋接&#xff0…

從零構建 Node20+pnpm+pm2 環境鏡像:基于 Dockerfile 的兩種方案及持久化配置指南

前言:在Node.js項目部署中,環境一致性和服務自動恢復是運維的核心需求。無論是本地開發還是生產部署,使用Docker封裝Node20、pnpm(高效包管理)和pm2(進程守護)環境,能避免“本地能跑…

【Python機器學習】4.3. 模型優化

喜歡的話別忘了點贊、收藏加關注哦(關注即可查看全文),對接下來的教程有興趣的可以關注專欄。謝謝喵!(・ω・) 4.3.1. 實戰中會遇到的問題 首先看一個例子: 根據任檢測數據x1x_1x1?、x2x_2x2…

Impact rating 影響等級定義(學習筆記)

影響等級可以通過四個方面定義,包含安全性safety,經濟型financial,操作性operational,和私密性privacy 即[S,F,O,P]這四個方面。每個方面又可以定義四個不同的等級,包含severe(嚴重的)&#xff…

同花順前端潛在面試題目與答案

潛在面試題目與答案 以下是根據您提供的“崗位職責”和“崗位要求”整理出的潛在面試題目和參考答案。請注意,這些答案僅供參考,您需要根據自己的實際經驗和理解進行更詳細和個性化的闡述。 一、基礎技術知識(Vue/前端工程化/HTML/CSS/JS&…

J2EE模式---組合實體模式

組合實體模式基礎概念組合實體模式(Composite Entity Pattern)是一種企業級設計模式,屬于 J2EE 模式的一種,其核心思想是將多個實體對象組合成一個更高層次的對象(組合實體),以簡化客戶端與這些…

基于CloudBase+React+CodeBudddy的云上智能睡眠應用開發實踐

本文詳細記錄了如何利用CloudBase云開發平臺、React前端框架和CodeBudddy智能編程技術棧,構建一個云端智能睡眠監測與分析系統。通過完整的項目實踐,探索AIoT時代健康管理應用的開發范式。一、智能睡眠監測:云時代的健康守護者在快節奏的現代…

QML 模型

QML模型基礎架構QML采用經典的Model-View-Delegate (MVD)?架構來分離數據與界面,這與MVC模式類似但更加適合聲明式UI開發。在這個架構中:?Model?:負責管理數據,可以是簡單的整數,也可以是復雜的C自定義模型?View?…

基于Trae IDE與MCP實現網頁自動化測試的最佳實踐

引言 在現代Web開發流程中,自動化測試已成為保障應用質量、提升開發效率的關鍵環節。Playwright作為一款新興的測試框架,因其出色的跨瀏覽器支持能力和豐富的API特性,正逐漸成為自動化測試領域的主流選擇。本文將詳細介紹如何在葡萄城Trae ID…

Android 動畫優化

動畫是提升 Android 應用用戶體驗的核心手段 —— 流暢的過渡動畫能讓頁面切換更自然,交互反饋動畫能讓操作更有質感。但動畫也是性能 “重災區”:掉幀、卡頓、內存暴漲等問題,往往源于對動畫原理和優化技巧的忽視。本文將從動畫性能的核心瓶…

Linux——進程間通信,匿名管道,進程池

文章目錄一、進程間通信(IPC)的理解1.為什么進程間要通信(IPC)2.如何進行通信二、匿名管道1.管道的理解2.匿名管道的使用3.管道的五種特性4.管道的四種通信情況5.管道緩沖區容量三、進程池1.進程池的理解2.進程池的制作四、源碼Pr…