RabbitMQ學習(一):RabbitMQ要點簡介

1、什麼是RabbitMQ?

RabbitMQ是由Erlang語言編寫的實現了高級消息隊列協議(AMQP)的開源消息代理軟件(也可稱爲 面向消息的中間件)。支持Windows、Linux/Unix、MAC OS X操作系統和包括JAVA在內的多種編程語言。


AMQP,即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。基於此協議的客戶端與消息中間件可傳遞消息,並不受 客戶端/中間件 不同產品,不同的開發語言等條件的限制。

2、RabbitMQ中的重要概念

 

圖片來源於網絡

 

(1)Broker:經紀人。提供一種傳輸服務,維護一條從生產者到消費者的傳輸線路,保證消息數據能按照指定的方式傳輸。粗略的可以將圖中的RabbitMQ Server當作Broker。

(2)Exchange:消息交換機。指定消息按照什麼規則路由到哪個隊列Queue。

(3)Queue:消息隊列。消息的載體,每條消息都會被投送到一個或多個隊列中。

(4)Binding:綁定。作用就是將Exchange和Queue按照某種路由規則綁定起來。

(5)RoutingKey:路由關鍵字。Exchange根據RoutingKey進行消息投遞。

(6)Vhost:虛擬主機。一個Broker可以有多個虛擬主機,用作不同用戶的權限分離。一個虛擬主機持有一組Exchange、Queue和Binding。

(7)Producer:消息生產者。主要將消息投遞到對應的Exchange上面。一般是獨立的程序。

(8)Consumer:消息消費者。消息的接收者,一般是獨立的程序。

(9)Channel:消息通道,也稱信道。在客戶端的每個連接裏可以建立多個Channel,每個Channel代表一個會話任務。

 

3、RabbitMQ的使用流程

AMQP模型中,消息在producer中產生,發送到MQ的exchange上,exchange根據配置的路由方式投遞到相應的Queue上,Queue又將消息發送給已經在此Queue上註冊的consumer,消息從queue到consumer有push和pull兩種方式。

消息隊列的使用過程大概如下:

(1)客戶端連接到消息隊列服務器,打開一個channel。

(2)客戶端聲明一個exchange,並設置相關屬性。

(3)客戶端聲明一個queue,並設置相關屬性。

(4)客戶端使用routing key,在exchange和queue之間建立好Binding關係。

(5)生產者客戶端投遞消息到exchange。

(6)exchange接收到消息後,就根據消息的RoutingKey和已經設置的binding,進行消息路由(投遞),將消息投遞到一個或多個隊列裏。

(7)消費者客戶端從對應的隊列中獲取並處理消息。

4、RabbitMQ的優缺點

優點

(1)由Erlang語言開發,支持大量協議:AMQP、XMPP、SMTP、STOMP。

(2)支持消息的持久化負載均衡集羣,且集羣易擴展。

(3)具有一個Web監控界面,易於管理。

(4)安裝部署簡單,上手容易,功能豐富,強大的社區支持。

(5)支持消息確認機制、靈活的消息分發機制。

缺點

(1)由於犧牲了部分性能來換取穩定性,比如消息的持久化功能,使得RabbitMQ在大吞吐量性能方面不及Kafka和ZeroMQ。

(2)由於支持多種協議,使RabbitMQ非常重量級,比較適合企業級開發。

 

因此當需要一個穩定的、高可靠性的、功能強大且易於管理的消息隊列可以選擇RabbitMQ。如果對消息吞吐量需求較大,且不在乎消息偶爾丟失的情況可以使用Kafka。

5、Exchange類型

5.1、Direct Exchange

(1)名稱:直接交換器類型

(2)默認的預先定義exchange名字:空字符串或者amq.direct

(3)作用描述:根據Binding指定的Routing Key,將符合Key的消息發送到Binding的Queue。可以構建點對點消息傳輸模型

 

圖片源於網絡

 

如圖中RoutingKey分別是error、info、warning,其中error被Binding(綁定)到queue1和queue2上,info和warning被Binding到queue2上。當消息的RoutingKey是error,這條消息將被投遞到queue1和queue2中(相當於消息被複製成兩個分別投放到兩個queue中),然後分別被Consumer1和Consumer2處理。如果消息的RoutingKey是info或者warning,這條消息只會被投遞到queue2中,然後被Consumer2處理。如果消息的RoutingKey是其他的字符串,這條消息則會被丟棄。

5.2、Fanout Exchange

(1)名稱:廣播式交換器類型

(2)默認的預先定義exchange名字:amq.fanout

(3)作用描述:將同一個message發送到所有同該Exchange 綁定的queue。不論RoutingKey是什麼,這條消息都會被投遞到所有與此Exchange綁定的queue中。

 

圖片來源於網絡

 

廣播式交換器類型的工作方式:不使用任何參數將queue和Exchange進行Binding,發佈者publisher向Exchange發送一條消息(注意:直接交換器類型中的producer變成了publisher,其中隱含了兩種交換器的區別),然後這條消息被無條件的投遞給所有和這個Exchange綁定的queue中。

如圖中,沒有RoutingKey的限制,只要消息到達Exchange,都會被投遞到queue1和queue2中,然後被對應的Consumer處理。

5.3、Topic Exchange

(1)名稱:主題交換器類型

(2)默認的預先定義exchange名字:amq.topic

(3)作用描述:根據Binding指定的RoutingKey,Exchange對key進行模式匹配後投遞到相應的Queue,模式匹配時符號“#”匹配一個或多個詞,符號“*”匹配正好一個詞,而且單詞與單詞之間必須要用“.”符號進行分隔。此模式可以用來支持經典的發佈/訂閱消息傳輸模型-使用主題名字空間作爲消息尋址模式,將消息傳遞給那些部分或者全部匹配主題模式的queue。

 

圖片來源於網絡

 

    如圖中,假如消息的RoutingKey是American.action.13,這條消息將被投遞到Q1和Q2中。假如RoutingKey是American.action.13.test(注意:此處是四個詞),這條消息將會被丟棄,因爲沒有routingkey與之匹配。假如RoutingKey是Chinese.action.13,這條消息將被投遞到Q2和Q3中。假如RoutingKey是Chinese.action.13.test,這條消息只會被投遞到Q3中,#可以匹配一個或者多個單詞,而*只能匹配一個詞。

5.4、Headers Exchange

(1)名稱:標題交換器類型

(2)默認的預先定義exchange名字:amq.matchamq.headers

(3)作用描述:同direct exchange類似,不同之處是不再使用Routing Key路由,而是使用headers(Message attributes)進行匹配路由到指定Queue。

Headers類型的exchange使用的比較少,它也是忽略routingKey的一種路由方式。是使用Headers來匹配的。Headers是一個鍵值對,可以定義成HashTable。發送者在發送的時候定義一些鍵值對,接收者也可以再綁定時候傳入一些鍵值對,兩者匹配的話,則對應的隊列就可以收到消息。匹配有兩種方式all和any。這兩種方式是在接收端必須要用鍵值"x-mactch"來定義。all代表定義的多個鍵值對都要滿足,而any則代碼只要滿足一個就可以了。fanout,direct,topic exchange的routingKey都需要要字符串形式的,而headers exchange則沒有這個要求,因爲鍵值對的值可以是任何類型。

代碼示例請參考文章RabbitMQ學習之Headers交換類型(java)》


下一篇文章:《RabbitMQ學習(二):Java使用RabbitMQ要點知識



參考文章

http://blog.csdn.net/zhu_tianwei/article/details/40923131

http://blog.csdn.net/whoamiyang/article/details/54954780

http://blog.csdn.net/olaking/article/details/47009753

【四川樂山程序員聯盟,歡迎大家加羣相互交流學習5 7 1 8 1 4 7 4 3】





發佈了41 篇原創文章 · 獲贊 63 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章