RabbitMQ基礎概念介紹

# 介紹


RabbitMQ是一個由Erlang語言開發的AMQP的開源實現。

AMQP是什麼東西?它是高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計,基於此協議和客戶端與中間件可以傳遞信息。

RabbitQM主要用在分佈式系統中存儲轉發信息。在易用性、拓展性、高可用性有很好的體現。主要的特點有:

  • 可靠性

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

  • 路由靈活(Flexible Routing)

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

  • 消息集羣(Clustering)

    多個RabbitMQ服務器可以組成一個集羣,形成一個邏輯上的Broker。

  • 高可用

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

  • 多種協議

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

  • 多語言客戶端

    RabbitMQ差不多支持所有常用語言,比如 Java、.NET、Ruby 、python等。

  • 管理界面

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

  • 跟蹤機制

    比如消息出現異常,Rabbit提供了消息跟蹤機制,使用者可以快速知道發生了什麼。

  • 插件機制

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

# RabbitMQ的架構


WeChat23cda9208cc74b75d1366fcc376fa33c

下面我們一一介紹架構中出現的關鍵組成部分

  • Message

    它是由消息和消息體組成,消息體是不透明的,消息頭則由一系列可選屬性組成,比如:routing-key(路由鍵)、priority(相對於其他消息的優先權)、delivery-mode(指出該消息可能需要持久性存儲)等。

  • Publisher

    是消息的生產者,也是一個向交換器發佈消息的客戶端應用程序。

  • Exchange

    交換器,用來接收生產者發送的消息並將這些消息路由給服務器中的隊列。

  • Binding

    字面意思是:綁定,用於消息隊列和交換器之間的關聯。一個綁定就是基於路由鍵將交換器和消息隊列連接起來的路由規則,所以可以將交換器理解成一個由綁定構成的路由表。

  • Queue

    消息隊列,用來保存消息直到發送給消費者。它是消息的容器,也是消息的終點。一個消息可投入一個或多個隊列。消息一直在隊列裏面,等待消費者連接到這個隊列將其取走。

  • Connection

    網絡連接,比如一個 TCP 連接。

  • Channel

    信道,多路複用連接中的一條獨立的雙向數據流通道。信道是建立在真實的TCP連接內地虛擬連接,AMQP 命令都是通過信道發出去的,不管是發佈消息、訂閱隊列還是接收消息,這些動作都是通過信道完成。因爲對於操作系統來說建立和銷燬 TCP 都是非常昂貴的開銷,所以引入了信道的概念,以複用一條 TCP 連接。

  • Consumer

    消息的消費者,表示一個從消息隊列中取得消息的客戶端應用程序。

  • Virtual Host

    虛擬主機,表示一批交換器、消息隊列和相關對象。虛擬主機是共享相同的身份認證和加密環境的獨立服務器域。

  • Broker

    表示消息隊列服務器實體。

# Exchange 類型


由上面我們知道,Exchange作爲接收生產者發送的消息並將這些消息路由給服務器中的隊列。那它是通過什麼策略來路由的呢,Exchange 分發消息時是根據類型的不同分發策略也不同。

目前共四種類型:direct、fanout、 topic、headers 。headers 匹配 AMQP消息的header而不是路由鍵,此外 headers 交換器和 direct 交換器完全一致,但性能差很多,目前幾乎用不到了,所以直接看另外三種類型:

  • Direct鍵(routingkey)分佈

    消息中的路由鍵(routing key)如果和Binding中的binding key一致, 交換器就將消息發到對應的隊列中。它是完全匹配、單播的模式。

    WeChat4126d7fdfae188a792671e52f336f62c

  • Fanout(廣播分發)

    每個發到 fanout 類型交換器的消息都會分到所有綁定的隊列上去。很像子 網廣播,每臺子網內的主機都獲得了一份複製的消息。fanout 類型轉發消息是最快的。

    WeChatcbcd18c1f6083f9d94a6f00cfc2927e5

  • topic 交換器(模式匹配)

    topic 交換器通過模式匹配分配消息的路由鍵屬性,將路由鍵和某個模式進行匹配,此時隊列需要綁定到一個模式上。它將路由鍵和綁定鍵的字符串切分成 單詞,這些單詞之間用點隔開。它同樣也會識別兩個通配符:符號「#」和符號 「」。#匹配 0 個或多個單詞,匹配不多不少一個單詞。

    WeChatb441f09875f3dd1f43d3c6c4b7a22170