讀古今文學網 > OpenStack系統架構設計實戰 > 8.2 AMQP消息隊列協議 >

8.2 AMQP消息隊列協議

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

通常消息中間件的主要功能是消息的路由(Routing)和緩存(Buffering)。AMQP作為消息中間件中提供類似功能的兩種域模型:Exchange(Routing)和Message queue(Buffering),如圖8-1所示。

圖8-1 AMQP組成

AMQP由3部分組成,分別是:

1)Exchange接收發佈應用程序發送的消息,並根據一定的規則將這些消息路由到消息隊列。

2)Message Queue存儲消息,直到這些消息被消費者安全處理完為止。

3)Binding定義了Exchange和Message Queue之間的關聯和路由規則。

Exchange本身不保持消息,只是起到路由的作用,Exchange接收消息生產者(Message Producer)發送的消息根據不同的路由算法將消息發送往Message Queue。Message Queue會在消息不能被正常消費時緩存這些消息,具體的緩存策略由實現者決定,當Message Queue與消息消費者(Message consumer)之間的連接通暢時,Message Queue會將消息轉發到consumer。

一個Broker(AMQP服務器)中會存在多個Message Queue?Exchange怎樣知道它要把消息發送到哪個Message Queue中去呢?圖8-1中的Binding就是通過綁定Exchange與Message Queue來解決這個問題。消息應用者(Client Application)控制Exchange與某個特定Message Queue綁定,並將這個Message Queue接受何種特定消息的條件綁定到Exchange,這個條件也叫Binding key或Criteria。

AMQP協議的架構如圖8-2示意。

圖8-2 AMQP協議的架構

下面詳細解釋一下AMQP的工作原理:

從圖8-2的AMQP架構圖看,Message是AMQP所操縱的基本單位,它由Producer產生,經過Broker被Consumer所消費。它的基本結構有兩部分:Header和Body。Header是由Producer添加上的各種屬性的集合,這些屬性有:控制Message是否可被緩存,接收的Queue是哪個,優先級是多少等。Body是真正需要傳送的數據,它是對Broker不可見的二進制數據流,在傳輸過程中不應該受到影響。

一個Exchange在與多個Message Queue通過綁定後,Exchange中就會存在一個路由表,這個表中存儲著每個Message Queue所需要消息的限制條件。Exchange就會檢查它接收到的每個Message的Header及Body信息,來決定將Message路由到哪個Queue中去。每個Message的Header中應該有個屬性叫Routing Key,它由Message發送者產生,提供給Exchange路由這條信息的標準。Exchange根據不同路由算法有不同有Exchange Type。

1)Direct類型,需要Binding Key等於Routing Key。

2)Topic類型,Binding Key與Routing Key符合一個帶通配符的等式關係。

3)根據Message包含的某些屬性來判斷。

4)Fanout類型,忽略Binding Key和Routing Key,消息傳遞到所有綁定的Message Queue。

這些基礎的路由算法由AMQP提供,當然Client Application也可以自定義各種自己的擴展路由算法。

當Exchange按照一定的路由算法把消息發到Message Queue後,作為消息的存儲和分發實體,Message Queue會把消息緩存到內存或硬盤中,並且按照順序把這些消息發給一個或者多個消息的消費者。

圖8-2中的虛擬主機(Virtual Host)用來指Exchange和Message Queue組成的集合。它是一個虛擬概念,一個虛擬主機可以是一台服務器,還可以是由多台服務器組成的集群,還可以是一些虛擬機組成的集群,上面運行一些Exchange和Message Queue。