RabbitMQ 系列(一)AMQP協議

介紹RabbitMQ前,有必須先了解一下AMQP協議。AMQP協議是一個高級抽象層消息通訊協議,RabbitMQAMQP協議的實現。它主要包括如下組件: 服務器

1. Server(broker): 接受客戶端鏈接,實現AMQP消息隊列和路由功能的進程。 spa

2. Virtual Host:實際上是一個虛擬概念,相似於權限控制組,一個Virtual Host裏面能夠有若干個Exchange和Queue,可是權限控制的最小粒度是Virtual Host 操作系統

3.Exchange:接受生產者發送的消息,並根據Binding規則將消息路由給服務器中的隊列。ExchangeType決定了Exchange路由消息的行爲,例如,在RabbitMQ中,ExchangeType有direct、Fanout和Topic三種,不一樣類型的Exchange路由的行爲是不同的。 線程

4.Message Queue:消息隊列,用於存儲還未被消費者消費的消息。 隊列

5.Message: 由Header和Body組成,Header是由生產者添加的各類屬性的集合,包括Message是否被持久化、由哪一個Message Queue接受、優先級是多少等。而Body是真正須要傳輸的APP數據。 進程

6.Binding:Binding聯繫了ExchangeMessage QueueExchange在與多個Message Queue發生Binding後會生成一張路由表,路由表中存儲着Message Queue所需消息的限制條件即Binding Key。當Exchange收到Message時會解析其Header獲得Routing KeyExchange根據Routing KeyExchange TypeMessage路由到Message QueueBinding KeyConsumerBinding ExchangeMessage Queue時指定,而Routing KeyProducer發送Message時指定,二者的匹配方式由Exchange Type決定。  事務

7.Connection:鏈接,對於RabbitMQ而言,其實就是一個位於客戶端和Broker之間的TCP鏈接。 路由

8.Channel:信道,僅僅建立了客戶端到Broker之間的鏈接後,客戶端仍是不能發送消息的。須要爲每個Connection建立Channel,AMQP協議規定只有經過Channel才能執行AMQP的命令。一個Connection能夠包含多個Channel。之因此須要Channel,是由於TCP鏈接的創建和釋放都是十分昂貴的,若是一個客戶端每個線程都須要與Broker交互,若是每個線程都創建一個TCP鏈接,暫且不考慮TCP鏈接是否浪費,就算操做系統也沒法承受每秒創建如此多的TCP鏈接。RabbitMQ建議客戶端線程之間不要共用Channel,至少要保證共用Channel的線程發送消息必須是串行的,可是建議儘可能共用Connection同步

9.Command:AMQP的命令,客戶端經過Command完成與AMQP服務器的交互來實現自身的邏輯。例如在RabbitMQ中,客戶端能夠經過publish命令發送消息,txSelect開啓一個事務,txCommit提交一個事務。 消息隊列


在瞭解了AMQP模型之後,須要簡單介紹一下AMQP的協議棧,AMQP協議自己包括三層:


1.       Modle Layer,位於協議最高層,主要定義了一些供客戶端調用的命令,客戶端能夠利用這些命令實現本身的業務邏輯,例如,客戶端能夠經過queue.declare聲明一個隊列,利用consume命令獲取一個隊列中的消息。

2.       Session Layer,主要負責將客戶端的命令發送給服務器,在將服務器端的應答返回給客戶端,主要爲客戶端與服務器之間通訊提供可靠性、同步機制和錯誤處理。

3.       Transport Layer,主要傳輸二進制數據流,提供幀的處理、信道複用、錯誤檢測和數據表示。

相關文章
相關標籤/搜索