1.簡介
MQ全程Message Queue,用於應用程序和應用程序間進行通信。RabbitMQ采用Erlang編寫,實現了AMQP(高級消息隊列)協議,跨平台,支持各種主流的操作系統和多種客戶端。
RabbitMQ相比其他同類型的消息隊列,最大的特點在保證可觀的單機吞吐量的同時,延時方面非常出色。
2. 相關術語
Broker:通俗講就是server,接收客戶端連接,實現AMQP協議的消息隊列和路由功能的進程;
Virtual Host:虛擬主機,類似於權限控制組。一個Virtual Host里可以有若干的Exchange和Queue,但權限控制的最小粒度是Virtual Host;
Producer:消息生產者;
Consumer:消息消費者;
Queue:存儲消息的隊列容器;
Message:生產者和消費者需要的消息數據;
Connection:一個tcp連接;
Channel:一個管道連接,是tcp連接內的連接(broker),使用現有的TCP連接進行數據傳輸;
Exchange:交換機,消息路由,生產者發送的消息並不是直接發送到隊列中而是先到指定的路由中,然后由路由根據路由key綁定的隊列發送到指定隊列中;
Binding:建立路由和隊列容器的綁定關系;
Routing key:路由key,主要用於尋找隊列。
3. Exchange的幾種工作模式
1. Direct--路由模式
任何發送到Direct Exchange的消息都會被轉發到RouteKey指定的Queue。
這種模式下不需要將Exchange進行任何綁定(binding)操作。
消息傳遞時需要一個“RouteKey”,可以簡單的理解為要發送到的隊列名字。
如果vhost中不存在RouteKey中指定的隊列名,則該消息會被拋棄。
2. Fanout--發布/訂閱模式
任何發送到Fanout Exchange的消息都會被轉發到與該Exchange綁定(Binding)的所有Queue上。
這種模式不需要RouteKey。
這種模式需要提前將Exchange與Queue進行綁定,一個Exchange可以綁定多個Queue,一個Queue可以同多個Exchange進行綁定。
如果接受到消息的Exchange沒有與任何Queue綁定,則消息會被拋棄。
3. Topic--匹配訂閱模式
任何發送到Topic Exchange的消息都會被轉發到所有關心RouteKey中指定話題的Queue上。
就是每個隊列都有其關心的主題,所有的消息都帶有一個“標題”(RouteKey),Exchange會將消息轉發到所有關注主題能與RouteKey模糊匹配的隊列。
這種模式需要RouteKey,也許要提前綁定Exchange與Queue。
在進行綁定時,要提供一個該隊列關心的主題。
.“#”表示0個或若干個關鍵字,“*”表示一個關鍵字。
同樣,如果Exchange沒有發現能夠與RouteKey匹配的Queue,則會拋棄此消息。
4. headers
headers exchange主要通過發送的request message中的header進行匹配,其中匹配規則(x-match)又分為all和any,all代表必須所有的鍵值對匹配,any代表只要有一個鍵值對匹配即可。headers exchange的默認匹配規則(x-match)是any。
RabbitMQ工作模式
在 RabbitMQ 官網上提供了 6 中工作模式:簡單模式、工作隊列模式、發布/訂閱模式、路由模式、主題模式 和 RPC 模式。
簡單模式和工作隊列模式
這兩種模式非常簡單,只涉及生產者、隊列、消費者。
生產者負責生產消息,將消息發送到隊列中,消費者監聽隊列,隊列有消息就進行消費。
工作隊列模式其實就是有多個消費者的簡單模式。
當有多個消費者時,消費者平均消費隊列中的消息。
發布/訂閱、路由與主題模式
這三種模式就要用到Exchange了。
生產者不直接與隊列交互,而是將消息發送到交換機中,再由交換機將消息發送到已綁定改交換機的隊列中給消費者消費。
常用的交換機類型有 3 種:fanout、direct、topic。
fanout不處理路由鍵,很像子網廣播,每台子網內的主機都獲得了一份復制的消息。
發布/訂閱模式就是指使用fanout交換模式。fanout 類型交換機轉發消息是最快的。
direct模式處理路由鍵,需要路由鍵匹配才能轉發。
路由模式使用的是 direct 類型的交換機。
topic:將路由鍵和某模式進行匹配。
主題模式使用的是 topic 類型的交換機。
RPC 模式
客戶端發送一個請求消息然后服務器回復一個響應消息。為了收到一個響應,我們需要發送一個'回調'的請求的隊列地址。