『壹』 rabbitmq命令和通過網頁查看rabbit的消息隊列
1:啟動
service rabbitmq-server start
2:啟用web管理界面
rabbitmq-plugins enable rabbitmq_management
3:創建用戶並設置許可權
不知道用戶和密碼的可以創建用戶並設置信碰液許可權然後登陸網頁查看
rabbitmqctl add_user admin admin123
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin '.*' '.*' '.*'
4:登陸查看rabbit的消息狀態
http://IP:15672/
5:其他命令吵空
滑物停止:service rabbitmq-server stop
啟動:service rabbitmq-server start
查看狀態:service rabbitmq-server status
查看狀態
rabbitmqctl status
查看用戶列表
rabbitmqctl list_users
『貳』 RabbitMQ-消息堆積&高可用
前置文章:
RabbitMQ-消息可靠性&延遲消息
一、MQ常見問題
二、消息堆積-惰性隊列
1、消息堆積問題
2、解決消息堆積方法
3、惰性隊列
三、高可用-MQ集群
1、集群分類
2、普通集群
3、鏡像集群
4、沖裁隊列
確保發送的消息至少被消費一次;
實現消息的延遲投遞;
處理消息無法及時消費的問題;
避免單點MQ故障導致整體不可用;
1、消息堆積問題
當生產者發送消息的速度超過了消費者處理消息的速度,輪鎮或就會導致隊列中的消息堆積,直到隊列存儲消息達到上限。最早接收到的消息,可能就會 成為死信 ,會 被丟棄 ,這就是消息堆積問題。
2、解決消息堆積方法
3、惰性隊列
從RabbitMQ的3.6.0版本開始,就增加了Lazy Queues的概念,也就是惰性隊列。
Ⅰ 接收到消息後直接 存入磁碟 而非內存;
Ⅱ 消費者要消費消息時才會 從磁碟中讀取 並載入到內存;
Ⅲ 支持 數百萬條 的消息臘伍存儲。
要設置一個隊列為惰性隊列,只需要在聲明隊列時,指定x-queue-mode屬性為lazy即可。
Ⅰ 可以通過命令行將一個運行中的隊列修改為惰性隊列,如下:
rabbitmqctl set_policy Lazy "^lazy-queue$" '{"queue-mode":"lazy"}' --apply-to queues
Ⅱ 用SpringAMQP聲明惰性隊列,如下:
@Bean註解的形式,如下:
@RabbitListener註解的形式,如下:
Ⅰ 優點
基於磁碟存儲,消息上限高;
沒有間歇性的page-out,性能比較穩定;
Ⅱ 缺點
基於磁碟存儲,消息時效性會降低;
性能受限於磁碟的IO。
官方文檔: Clustering Guide — RabbitMQ 。
1、集群分類
是一種 分布式集群 ,將隊列分散到集群的各個節點,從而提高整個集群的並發能力。
是一種 主從集群 ,普通集群的基礎上,添加了主從備份功能,提高集群的數據可用性。
注意:鏡像集群雖然支持主從,但主從同步並不是強一致的,某些情況下可能有數據丟失的風險。
在RabbitMQ的3.8版本以後推出的,底層採用Raft協議確保主從的數據一致性。
2、普通集群
Ⅰ 會在集群的各個節點間共享部分數據,包括:交換機、隊列元信息。不包含隊列中的消息;
Ⅱ 當訪問集群某節點時,如果隊列不在該節點,會從數據所在節點傳遞到當前節點並返回;
Ⅲ 隊列所在節點宕機,隊列中的消息就會丟失。
Ⅰ 獲取Cookie
RabbitMQ底層依賴於Erlang,而Erlang虛擬機就是一個面向分布式的語言,默認就支持集群旅者模式。集群模式中的每個RabbitMQ 節點使用 cookie 來確定它們是否被允許相互通信。
要使兩個節點能夠通信,它們必須具有相同的共享秘密,稱為 Erlang cookie 。cookie 只是一串最多 255 個字元的字母數字字元。
每個集群節點必須具有 相同的 cookie 。實例之間也需要它來相互通信。
首先獲取Cookie,指令如下:
其中 YYNCLCJEKVNUFYQFPNZH 這一串就是生成的Cookie,如下:
Ⅱ 刪除現有mq容器
Ⅲ 准備rabbitmq.conf配置文件
此處選擇在tmp目錄下創建,如下:
配置文件內容如下:
Ⅳ 准備Cookie記錄文件
Ⅴ 准備集群目錄
Ⅵ 拷貝配置文件、Cookie文件到目錄
echo :用於字元串的輸出,輸出字元串到 | 後面;
-t :表示先列印命令,再執行;
-n 1 :表示執行命令時用的args個數為1個。
Ⅶ 創建集群網路
Ⅷ 運行容器
集群中的節點標示默認都是: rabbit@[hostname] 。
Ⅰ 往rabbit@mq1添加隊列
在mq2、mq3中也可以查看到該隊列,因為元信息共享。
Ⅱ 往simple.queue添加數據
在mq2、mq3中可以查看到消息,如下:
Ⅲ 讓mq1宕機
mq2、mq3無法讀取到數據,因為只共享元信息,沒有同步備份數據,如下:
3、鏡像集群
鏡像集群官方文檔: Classic Queue Mirroring — RabbitMQ 。
普通集群不具備高可用的特性,使用鏡像集群可以解決這個問題。
Ⅰ 鏡像隊列結構是一主多從(從就是鏡像);
Ⅱ 所有操作都是主節點完成,然後同步給鏡像節點;
Ⅲ 主宕機後,鏡像節點會替代成新的主(如果在主從同步完成前,主就已經宕機,可能出現數據丟失);
Ⅳ 不具備負載均衡功能,因為所有操作都會有主節點完成(但是不同隊列,其主節點可以不同,可以利用這個提高吞吐量)。
Ⅰ 設置exactly模式
Ⅱ 創建隊列
Ⅲ 發送消息
Ⅳ 讓mq1宕機
注意:mq1恢復後,該隊列的主節點仍然為mq3。
4、沖裁隊列
Ⅰ 與鏡像隊列一樣,都是主從模式,支持主從數據同步;
Ⅱ 使用非常簡單,沒有復雜的配置;
Ⅲ 主從同步基於Raft協議,強一致。
注意:仲裁隊列是3.8版本以後才有的新功能。
+2表示有2個鏡像節點,仲裁隊列默認鏡像數為5,集群節點不足5則都是鏡像。
@Bean註解配置
修改配置文件
以上即為RabbitMQ-消息堆積&高可用的全部內容,感謝閱讀。
『叄』 rabbitmq如何查找相同的消息內容
消息ID。RabbitMQ可以通過消息的唯一標識符來查找相同的消息內容,這個唯一標識友畝跡符叫做消息ID。消息ID可以由生產者指定或者由好並RabbitMQ自動分配。如果生產者沒有設置消息ID,RabbitMQ就會自動生成一耐檔個全局唯一的消息ID。
『肆』 RabbitMQ 消息狀態
消息的位置:消息是保存在內存或磁碟上的;
消息是有索引的,索引的位置也是在內存或磁碟上的;
同一時刻可能內存和磁碟中都有消息或索引.
這些場景是根據隊列類型來決定的.
在rabbit中,隊列中的消息可能會處理以下四種狀態畢襲:
alpha:消息內容以及消息在隊列中的位置(消息索引)都保存在內存中;
beta:消息內容只在磁碟上,消息索引只在內存中;
gamma:消息內容只在磁碟上,消息索引在內存和磁碟上都存在;
delta:消息的內容和索引都在磁碟上。
——對於持久化消息,消息內容和消息索引都必須先保存在磁碟上,然後才處於上述狀態中的一種。即屬性是Durable的消息.
通過狀態的流轉來實現消息位置的變化,目的是在時間和空間中做出合理的取捨.
從內存個CPU的角度來理解就是滿足不同的內存和CPU需求。
alpha最耗內存,但很少消耗CPU,因為直接存儲在內存中;
delta基本不消耗內存,但是要消耗更多的CPU以及磁碟I/O操作(delta需要兩次I/O操作,一次讀索引,一次讀消息內容, 所以消息盡可能的發送完立刻被消費;
beta及gamma只需要一次I/O操作來讀取消息內容)。
gamma更多的是持久化的消息出現的狀態。
在隊列的狀態vqstate(參見 [$RABBIT_SRC/src/rabbit_variable_queue.erl])結構中,存在q1,q2,delta,q3,q4五個隊列(使用 q1~q4使用Erlang的queue模塊,delta存儲結構依賴於消息索引的實現),其中q1,q4隻包含alpha狀態的消 息,q2,q3隻包含beta和gamma狀態的消息,delta包含delta狀態的消息。
一般情況下消息會以q1->q2->delta->q3->q4的順序進行狀態變換:消息進入隊列時,處於alpha狀態並保存 在內存中(q1或q4),然後某個時刻發現內存不足,被轉換到beta狀態(q2,q3)(這時候其實有兩個轉換 q1->q2,q4->q3),如果還是內存不足,被轉換到delta狀態(delta)(q2->delta,q3->delta);當從隊 列中消費消息時,會先從處於alpha狀態的內存隊列(q4)中獲取消息,如果q4為空,則從beta狀態的隊列 (q3)中獲取消息,如果q3也為空,則會從delta狀態的消息隊列中讀取消息,並將之轉移到q3。
上述步驟只是個一般步驟,實際運行時,中間的步驟都是可以跳過的,比如消息可能在一開始被放在q4隊列 中、q1隊列中的元素會直接跳到q4隊列中(這兩種情況下,q3,delta,q2隊列都為空);當delta隊列為空 時,q2隊列可以直接跳到q3隊列,q1隊列也可以直接跳到q3。
RabbitMQ系統中隊列進程中消息流動邏輯 1.publish(消息的插入)
如果Q3隊列為空,則將消息放入Q4隊列,如果Q3隊列不為空,則將消息放入Q1隊列 2.alpha類畢數州型的消息轉化為beta類型的消息(將消息的內容存入磁碟文件)(push_alphas_to_betas函數)
(1).Q1隊列的轉化,如果磁碟文件中的消息數量為0,則將Q1中的消息寫入Q3隊列,如果磁碟文件中的 消息數量不為0,則將Q1中的消息寫入Q2隊列
(2).Q4隊列的轉化,從Q4隊列末端將消息放入到Q3隊列的末端 3.beta類型的消手蔽息delta類型的消息(push_betas_to_deltas函數)
(1).從Q3隊列末端將消息的隊列索引存入磁碟文件
(2).將Q2隊列中的消息的隊列索引存入磁碟文件 4.如果Q4,Q3中的消息為空,且磁碟文件中有消息,則將從磁碟中讀取消息,會將delta類型的消息轉化為 beta類型的消息
(1).如果讀取一個隊列索引磁碟文件後磁碟文件中已經沒有消息,則先將讀取到的消息存入Q3隊列末 尾,然後將Q2隊列中的消息存入Q3隊列的末尾
(2).如果讀取一個隊列索引磁碟文件後的磁碟文件中還有消息,則將讀取到的消息存入Q3隊列末尾
『伍』 rabbitmq集群模式怎麼看到所有節點的statistics
我喊氏也沒搜到,但是查看單個節點狀態用這個rabbitmqctl cluster_status
(據說在瀏覽器中可以看到所有節點的信息,如果其他節點信息沒有顯示啟用web管鄭姿散理就好,注意這個地冊巧方的埠也可能是 15672,所以如果55672埠不行的話就換15672試試,附上原文鏈接網頁鏈接)