RabbitMQ原理與相關操作(二)
接著 上篇隨筆 增加幾個概念:
RabbitMQ是一個在AMQP(高級消息隊列協議)標準基礎上完整的,可服用的企業消息系統。
AMQP模型的功能組件圖(上圖摘自 Sophia_tj 的 第2章 AMQP模型)
AMQP的四個總要概念:
1、虛擬主機(virtual host)或(vhost)
2、交換機(exchange)
3、隊列(queue)
4、綁定器(bind)
什麽是虛擬主機?一組交換機、隊列和綁定器 被稱為 虛擬主機(vhost)。
為什麽要用虛擬主機?RabbitMQ server 可以說就是一個消息隊列服務器實體(Broker),Broker當中可以有多個用戶(增加用戶的命令),而用戶只能在虛擬主機的粒度進行權限控制,所以RabbitMQ中需要多個虛擬主機。每一個RabbitMQ服務器都有一個默認的虛擬主機“/”。
隊列(queue)是消息載體,每個消息都會被投入到一個或多個隊列。試圖創建一個已經存在的隊列,RabbitMQ會直接忽略這個請求。(接收消息的實體)
把消息放進隊列前,我們還需要使用另一個東西:交換機。
交換機(exchange),它指定消息按什麽規則,路由到哪個隊列。它可以被理解成具有路由表的路由程序。(發送消息的實體)
交換機可以存在多個,每個交換機在自己獨立的進程當中執行,因此增加多個交換機就是增加多個進程,可以充分利用服務器上的CPU核以便達到更高的效率。
交換機如何判斷要把消息送到哪個隊列?這是我們需要路由規則,也就需要綁定器了。
綁定器(bind)它的作用就是把exchange和queue按照路由規則綁定起來。(將交換器和隊列連接起來,並且封裝消息的路由信息)
每個消息都有一個稱為路由關鍵字(routingKey)的屬性,exchange根據這個關鍵字進行消息投遞,其實就是一個簡單的字符串。(綁定操作就可以理解成:將exchange將具有路由關鍵字 “X” 的消息投遞到到名為“business”的隊列當中去。)
從而一個綁定就可以概括為:一個基於路由鍵將交換機和隊列連接起來的路由規則。
需要註意:由Exchange,Queue,RoutingKey三個,才能決定一個從Exchange到Queue的唯一的線路。
程序中連接與消息使用的兩個關鍵概念
連接(Connection):與RabbitMQ Server建立的一個連接,由ConnectionFactory創建,每個connection只與一個物理的Server進行連接,此連接是基於Socket進行連接的。AMQP一般使用TCP。
通道 (Channel):消息通道(主要進行相關定義,發送消息,獲取消息,事務處理等),在客戶端的每個連接裏,可建立多個channel,每個channel代表一個會話任務。
Channel在.net的客戶端程序裏應該是叫“Model”,采用IModel CreateModel()創建的,但是其他語言的客戶端都叫Channel。
需要註意:一個Connection可以有多個Channel。
為什麽設計中引入Channel概念?
一個比較普遍的需求:客戶端程序有時候會是一個多線程程序,每一個線程都想要和RabbitMQ進行連接,但是又不想共享一個連接。
因為一個Connection就是一個TCP鏈接,RabbitMQ在設計的時候不希望與每一個客戶端保持多個TCP連接,但這確實是有些客戶端的需求,每一個Channel之間沒有任何聯系,是完全分離的。
建立在Connection基礎上的一個Channel,相對於Connection來說,它是輕量級的。Channel可以在多線程中使用,但是在必須保證任何時候只有一個線程執行命令。
不得不重點介紹的交換機
交換機定義參數type: 直接式交換機direct,topic 和 fanout。
auto_delete: 當所有綁定隊列都不再使用時,是否自動刪除該交換機。
交換機類型:
Fanout: 不處理路由鍵,將消息廣播給綁定到該交換機的所有隊列。 不論消息的路由關鍵字是什麽,這條消息都會被路由到所有與該交換器綁定的隊列中。
廣播式交換器類型的工作方式如下:
不使用任何參數將消息隊列與交換器綁定在一起。
發布者(直接式交換器類型描述中的producer變成了publisher,已經隱含了二種交換器類型的區別)向交換器發送一條消息。 消息被無條件的傳遞到所有和這個交換器綁定的消息隊列中。
Direct: 處理路由鍵,對消息路徑進行全文匹配。消息路由鍵 "sunshine" 只能匹配 "sunshine" 綁定,不匹配 "sunshine.warm" 這類綁定。
通過精確匹配消息的路由關鍵字,將消息路由到零個或者多個隊列中,綁定關鍵字用來將隊列和交換器綁定到一起。這讓我們可以構建經典的點對點隊列消息傳輸模型,不過和任何已定義的交換器類型一樣,當消息的路由關鍵字與多個綁定關鍵字匹配時,消息可能會被發送到多個隊列中。
在direct模式下還可以實現多路綁定,即一個exchange和多個queue綁定時,具有同樣的bindkey,如下圖:
Topic: 處理路由鍵,按模式匹配路由鍵。模式符號 "#" 表示一個或多個單詞,"*" 僅匹配一個單詞。如 "wood.#" 可匹配 "wood.palm.redwood",但 "wood.*" 只匹配 "wood.deadwood"。
主題式交換器類型提供了這樣的路由機制:通過消息的路由關鍵字和綁定關鍵字的模式匹配,將消息路由到被綁定的隊列中。這種路由器類型可以被用來支持經典的發布/訂閱消息傳輸模型——使用主題名字空間作為消息尋址模式,將消息傳遞給那些部分或者全部匹配主題模式的多個消費者。
主題交換器類型的工作方式如下:
綁定關鍵字用零個或多個標記構成,每一個標記之間用“.”字符分隔。綁定關鍵字必須用這種形式明確說明,並支持通配符:“*”匹配一個詞組,“#”零個或多個詞組。
因此綁定關鍵字“*.dask.#”匹配路由關鍵字“class.dask”和“eur.dask.tab”,但是不匹配“dask.rho”。
這種交換器類型是可選的。
主題式的原理圖解:
t
此圖摘自 張善友先生的博客:http://www.cnblogs.com/shanyou/p/4067250.html
以上這些概念,要是不了解,估計以後的相關的操作,出現問題都不知道怎麽解決。還是原理先行吧。
參考:
http://www.cnblogs.com/shanyou/p/4067250.html
https://my.oschina.net/dddttttt/blog/541076?p=1
RabbitMQ原理與相關操作(二)