當前位置:
首頁 > 最新 > 深入理解消息中間件技術之RabbitMQ服務

深入理解消息中間件技術之RabbitMQ服務

有趣有內涵的文章第一時間送達!


什麼叫消息隊列?

消息(Message)是指在應用間傳送的數據。消息可以非常簡單,比如只包含文本字元串,也可以更複雜,可能包含嵌入對象。消息隊列(Message Queue)是一種應用間的通信方式,消息發送後可以立即返回,由消息系統來確保消息的可靠傳遞。消息發布者只管把消息發布到 MQ 中而不用管誰來取,消息使用者只管從 MQ 中取消息而不管是誰發布的。這樣發布者和使用者都不用知道對方的存在。


消息隊列是一種應用間的,那什麼時候需要使用消息隊列呢?像用戶下單之後、生成訂單、結算,定時給系統註冊用戶推送活動消息,一些常見的流程類的業務都會用到消息隊列服務。


RabbitMQ是一個消息的代理器,用於接收和發送消息,你可以這樣想,他就是一個郵局,當您把需要寄送的郵件投遞到郵筒之時,你可以確定的是郵遞員先生肯定會把郵件發送到需要接收郵件的人的手裡,不會送錯的。在這個比喻中,RabbitMQ就是一個郵箱,也可以理解為郵局和郵遞員,他們負責把消息發送出去和用於接收信息。

RabbitMQ和郵局這兩者之間的主要區別是它不會處理紙質郵件,取而代之的是接收、存儲和發送二進位數據塊,也就是我們通常所說的消息。

下圖是RabbitMQ服務的內部結構

1)Message

消息,它由消息頭和消息體兩部分組成。消息體是不透明的,但消息頭是由一些屬性組成的,其中包括:routing-key(路由鍵)、priority(優先權)、delivery-mode(持久存儲)。

2)Publisher

生產者,也是消息的生產者,它是向交換器發布消息的應用程序

3)Exchange

交換器,用來接收生產者傳遞過來的消息,然後將這些消息路由至伺服器中的隊列

4)Binding

綁定,用於消息隊列與交換器之間的溝通。也是消息路由的規則,相當於一個路由表。

5)Queue

消息隊列,用來保存消息直到發送給消費者。一個消息可以進入一個或多個隊列,除消費者取走消息,否則它一直在消息隊列里。

6)Connection

網路連接,如:一個TCP連接

7)Channel

信道,多路復用連接中一個獨立的雙向數據傳輸通道。無論是發布消息、訂閱隊列、接收消息都是通過信道來完成。復用信道是為了降低系統資源的消耗。

8)Consumer

消費者,也就是接收生產者發來的消息的客戶端應用。

9)Virtual Host

虛擬主機,交換器、消息隊列相關的對象。一個VHOST其實可以看成一個rabbitmp伺服器,它擁有自己的隊列、交換器、綁定與許可權機制等。Rabbitmq默認vhost是/。

RabbitMQ 是一個由 Erlang 語言開發的 AMQP 的開源實現。AMQP :Advanced Message Queue,高級消息隊列協議。它是應用層協議的一個開放標準,為面向消息的中間件設計,基於此協議的客戶端與消息中間件可傳遞消息,並不受產品、開發語言等條件的限制。

RabbitMQ 最初起源於金融系統,用於在分散式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。

具體特點包括:

1)可靠性(Reliability

RabbitMQ 使用一些機制來保證可靠性,如持久化、傳輸確認、發布確認。

2)靈活的路由(Flexible Routing)

在消息進入隊列之前,通過Exchange 來路由消息的。對於典型的路由功能,RabbitMQ 已經提供了一些內置的Exchange 來實現。針對更複雜的路由功能,可以將多個Exchange綁定在一起,也通過插件機制實現自己的 Exchange 。

3)消息集群(Clustering)

多個 RabbitMQ 伺服器可以組成一個集群,形成一個邏輯 Broker 。

4)高可用(Highly Available Queues)

隊列可以在集群中的機器上進行鏡像,使得在部分節點出問題的情況下隊列仍然可用。

5)多種協議(Multi-protocol)

RabbitMQ 支持多種消息隊列協議,比如 STOMP、MQTT 等等。

6)多語言客戶端(Many Clients)

RabbitMQ 幾乎支持所有常用語言,比如 Java、.NET、Ruby 等等。

7)管理界面(Management UI)

RabbitMQ 提供了一個易用的用戶界面,使得用戶可以監控和管理消息 Broker 的許多方面。

8)跟蹤機制(Tracing)

如果消息異常,RabbitMQ 提供了消息跟蹤機制,使用者可以找出發生了什麼。

9)插件機制(Plugin System)

RabbitMQ 提供了許多插件,來從多方面進行擴展,也可以編寫自己的插件。


1)客戶端連接到消息隊列伺服器,開啟一個channel

2)客戶端聲明一個exchange、queue,並配置相關屬性

3)客戶端使用routing key,在exchange與queue之間建立好綁定關係

4)客戶端傳遞消息到交換器

5)交換器接收到消息後,根據預定的KEY與綁定關係,對消息進行路由至消息隊列


1)首先需要安裝Erlang環境

2)下載安裝Rabbitmq

3)查看狀態信息

自帶多個命令行工具

1)rabbitmqctl #管理與操作命令

停止節點

訪問節點狀態,有效配置,運行狀況檢查

虛擬主機管理

用戶和許可權管理

政策管理

列出隊列,連接,渠道,交流,消費者

集群成員管理

2)rabbitmq-plugins #是一個管理插件的工具

3)rabbitmqadmin #它可以執行一些與WEB界面相同的操作,rabbitmqadmin只是一個專門的HTTP客戶端。

安裝管理插件後,http://:15672 /cli/rabbitmqadmin 進行下載


RabbitMQ 是用 erlang 開發的,集群非常方便,因為 erlang 天生就是一門分散式語言,但其本身並不支持負載均衡。

RabbitMQ 的集群節點包括:

1)內存節點

內存節點就是將所有數據放在內存,只保存狀態到內存(例外的情況:持久的queue內容將被保存到 disk)

2)磁碟節點。

磁碟節點將數據放在磁碟,保存狀態到內存和磁碟,內存節點雖然不寫入磁碟,但是它執行比磁碟節點要好,集群中,只需要一個磁碟節點來保存狀態 就足夠了,如果集群中只有內存節點,那麼不能停止它們,否則所有的狀態,消息等都會丟失。

不過,如前文所述,如果在投遞消息時,打開了消息的持久化,那即使是內存節點,數據還是安全的放在磁碟。一個 RabbitMQ 集群中可以共享 user、vhost、queue、exchange 等,所有的數據和狀態都是必須在所有節點上複製的,一個例外是那些當前只屬於創建它的節點的消息隊列,儘管它們可見且可被所有節點讀取。 RabbitMQ 節點可以動態地加入到集群中,一個節點它可以加入到集群中,也可以從集群環集群進行一個基本的負載均衡。

Rabbit 模式大概分為以下三種:

1)單一模式

2)普通模式

3)鏡像模式

單一模式:最簡單的情況,非集群模式。普通模式:默認的集群模式。

對於 Queue 來說,消息實體只存在於其中一個節點,A、B 兩個節點僅有相同的元數據,即隊列結構。當消息進入 A 節點的 Queue 中後,consumer 從 B 節點拉取時,RabbitMQ 會臨時在 A、B 間進行消息傳輸,把 A 中的消息實體取出並經過 B 發送給 consumer. 所以 consumer 應盡量連接每一個節點,從中取消息。即對於同一個邏輯隊列,要在多個節點建立物理 Queue。否則無論 consumer 連 A 或 B,出口總在 A,會產生瓶頸。該模式存在一個問題就是當 A 節點故障後,B 節點無法取到 A 節點中還未消費的消息實體。如果做了消息持久化,那麼得等 A 節點恢復,然後才可被消費。

鏡像模式:

把需要的隊列做成鏡像隊列,存在於多個節點,屬於 RabbitMQ 的 HA 方案。

該模式解決了上述問題,其實質和普通模式不同之處在於,消息實體會主動在鏡像節點間同步,而不是在 consumer 取數據時臨時拉取。該模式帶來的副作用也很明顯,除了降低系統性能外,如果鏡像隊列數量過多,加之大量的消息進入,集群內部的網路帶寬將會被這種同步通訊大大消耗掉,所,在對可靠性要求較高的場合中適用。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 民工哥Linux運維 的精彩文章:

TAG:民工哥Linux運維 |