1. 程式人生 > 其它 >RabbitMQ的簡單介紹

RabbitMQ的簡單介紹

1、RabbitMQ的簡介

RabbitMQ是由erlang語言開發,基於AMQP協議實現的訊息佇列,它的併發能力強,效能極好,延遲極低,穩定性和安全性很高,同時還支援叢集。RabbitMQ在分散式系統開發中應用非常廣泛,是最受歡迎的開源訊息中介軟體之一。

注意:由於RabbitMQ是採用erlang語言開發的,所以必須有erlang環境才可以執行

AMQP 協議:AMQP(advanced message queuing protocol)在2003年時被提出,最早用於解決金融領不同平臺之間的訊息傳遞互動問題。顧名思義,AMQP是一種協議,更準確的說是一種binary wire-level protocol(連結協議),提供統一訊息服務的應用層標準協議,基於此協議的客戶端與訊息中介軟體可傳遞訊息,並不受客戶端、中介軟體等不同產品,不同開發語言等條件的限制。這是其和JMS的本質差別,AMQP不從API層進行限定,而是直接定義網路交換的資料格式。這使得實現了AMQP的provider天然性就是跨平臺的。


JMS:即Java訊息服務(JavaMessage Service)應用程式介面,是一個Java平臺中關於面向訊息中介軟體(MOM)的API,用於在兩個應用程式之間,或分散式系統中傳送訊息,進行非同步通訊。


AMQP 與 JMS 區別

  • JMS是定義了統一的介面,來對訊息操作進行統一;AMQP是通過規定協議來統一資料互動的格式
  • JMS限定了必須使用Java語言;AMQP只是協議,不規定實現方式,因此是跨語言的。
  • JMS規定了兩種訊息模式;而AMQP的訊息模式更加豐富

2、RabbitMQ的特點

RabbitMQ最初起源於金融系統,用在分散式系統中儲存轉發訊息,在易用性、擴充套件性、高可用等方面表現不俗,具體特點包括:

  • 可靠性:使用一些機制保證可靠性,如持久化、傳輸確認、釋出確認。
  • 靈活的路由:在訊息進入佇列之前,通過Exchange交換機來路由訊息。對於典型的路由功能,RabbitMQ已經提供了一些內建的Exchange來實現。針對更復雜的路由功能,可以將多個Exchange繫結在一起或開發自己的Exchange。
  • 訊息叢集:多個RabbitMQ組成一個叢集,形成一個邏輯的broker。
  • 高可用:佇列可以在叢集中的機器上進行映象,使得在部分節點出問題的情況下佇列下仍然可用。
  • 多種協議:支援多種訊息佇列協議,比如STOMP、MQTT等。
  • 多語言客戶端:支援幾乎所有常用語言,比如java、rubu、.NET等。
  • 管理介面:提供了一個易用的使用者介面,使得使用者可以監控和管理訊息的broker
  • 跟蹤機制:如果訊息異常,rabbitMQ提供了訊息跟蹤機制,使用者可以找出發生了什麼。

3、RabbitMQ的基礎架構

RabbitMQ是AMQP協議的一個開源實現,所以其內部實際上也是AMQP中的基本概念,如下圖所示:

  1. Publisher:訊息生產者,就是投遞訊息的程式,也是一個向交換機發布訊息的客戶端應用程式。生產者傳送的訊息一般包含兩個部分:訊息體和內容標籤。
  2. Consumer:訊息消費者,也就是接收訊息的一方。消費者連線到RabbitMQ伺服器,並訂閱到佇列上。消費訊息時只消費訊息體,丟棄標籤。
  3. Connection :網路連線,比如一個TCP連線,用於連線到具體Broker。
  4. Channel: 通道,AMQP 命令都是在通道中進行的,不管是釋出訊息、訂閱佇列還是接收訊息,這些動作都是通過通道完成。因為建立和銷燬 TCP 都是非常昂貴的開銷,所以引入了通道的概念,以複用一條 TCP 連線,一個TCP連線可以用多個通道。客戶端可以建立多個channel,每個channel表示一個會話任務。
  5. Broker服務節點:表示訊息佇列伺服器實體。一般情況下一個Broker可以看做一個RabbitMQ伺服器。
  6. Exchange:交換器,接受生產者傳送的訊息,根據路由鍵將訊息路由到繫結的佇列上。
  7. Queue:訊息佇列,用來存放訊息。一個訊息可投入一個或多個佇列,多個消費者可以訂閱同一佇列,這時佇列中的訊息會被平攤(輪詢)給多個消費者進行處理。
  8. Message:訊息,由訊息體和標籤組成。訊息體是不透明的,而標籤則由一系列的可選屬性組成,這些屬性包括routing-key(路由鍵)、priority(相對於其他訊息的優先權)、delivery-mode(指出該訊息可能需要永續性儲存)等。
  9. Routing Key: 路由關鍵字,用於指定這個訊息的路由規則,需要與交換器型別和繫結鍵(Binding Key)聯合使用才能最終生效。
  10. Binding:繫結,通過繫結將交換器和佇列關聯起來,一般會指定一個BindingKey,通過BindingKey,交換器就知道將訊息路由給哪個隊列了。
  11. Virtual host:虛擬主機,用於邏輯隔離,表示一批獨立的交換器、訊息佇列和相關物件。一個Virtual host可以有若干個Exchange和Queue,同一個Virtual host不能有同名的Exchange或Queue。最重要的是,其擁有獨立的許可權系統,可以做到 vhost 範圍的使用者控制。當然,從 RabbitMQ 的全域性角度,vhost 可以作為不同許可權隔離的手段。

4、Exchange交換器的型別

Exchange分發訊息時根據型別的不同分發策略有區別,目前共四種類型:direct、fanout、topic、headers,由於headers交換器和direct交換器完全一致,且效能差很多,目前幾乎用不到。這裡只看direct、fanout、topic這三種類型:

  1. direct(直連):訊息中的路由鍵(RoutingKey)如果和 Bingding 中的 bindingKey 完全匹配,交換器就將訊息發到對應的佇列中。是基於完全匹配、單播的模式。
  2. fanout(廣播):把所有傳送到fanout交換器的訊息路由到所有繫結該交換器的佇列中,fanout 型別轉發訊息是最快的。
  3. topic(主題):通過模式匹配的方式對訊息進行路由,將路由鍵和某個模式進行匹配,此時佇列需要繫結到一個模式上。匹配規則:
    • ① RoutingKey 和 BindingKey 為一個 點號 '.' 分隔的字串。 比如: stock.usd.nyse;可以放任意的key在routing_key中,當然最長不能超過255 bytes。
    • BindingKey可使用 * 和 # 用於做模糊匹配:*匹配一個單詞,#匹配0個或者多個單詞;
  4. headers:不依賴於路由鍵進行匹配,是根據傳送訊息內容中的headers屬性進行匹配,除此之外 headers 交換器和 direct 交換器完全一致,但效能差很多,目前幾乎用不到了。

5、RabbitMQ的幾種模式

RabbitMQ提供了6種模式:

  1. 簡單模式:一對一模式,只有一個生產者,一個佇列,一個消費者,是最簡單的模式。
  2. 工作佇列模式:一對多模式,一個訊息生產者,一個訊息佇列,多個消費者。
  3. Publish/Subscribe釋出與訂閱模式:無選擇接收訊息,一個訊息生產者,一個交換器,多個訊息佇列,多個消費者。
  4. Routing路由模式:在釋出/訂閱模式的基礎上,有選擇的接收訊息,也就是通過 routing 路由進行匹配條件是否滿足接收訊息。
  5. Topics主題模式:同樣是在釋出/訂閱模式的基礎上,根據主題匹配進行篩選是否接收訊息,比第四類更靈活(也是最常用的一種)。
  6. RPC遠端呼叫模式(遠端呼叫,不太算MQ;不作介紹)

官網對應模式介紹:https://www.rabbitmq.com/getstarted.html

作者: 唐浩榮 出處: https://www.cnblogs.com/tanghaorong 本文版權歸作者和部落格園共有,歡迎轉載,但是轉載需在部落格的合適位置給出原文連結,否則保留追究法律責任的權利。