一、簡介
AMQP全稱是Advanced MessageQueuing Protocol (高級消息隊列協議)。其官方網站在[1]。
AMQP是一個應用層的異步消息傳遞協議,爲面向消息的中間件而設計。其目的是通過協議使應用模塊之間或應用程序與中間件等進行充分解耦。而在設計初期,AMQP的原始用途只是爲金融界提供一個可以彼此協作的消息協議。現在已經有相當一部分遵循AMQP的服務器和客戶端供使用。其中RabbitMQ是AMQP的一款開源標準實現。RabbitMQ的官方網站參見[2].
AMQP現在已經成爲OASIS的標準之一。
二、概念及技術
1.協議
AMQP的設計理念與數據通信網絡中的路由協議有些相似。從應用程序角度,AMQP的應用也是服務器/客戶端模式。但是在消息隊列中,AMQP通過隊列的狀態決定生產者(Producer)、消費者(Consumer)之間的連接。
AMQP協議分爲三層:ModelLayer,規範服務器和Broker行爲;Session Layer定義客戶端與服務器端Broker的上下文;Transport Layer傳輸二進制數據流。
2.Broker模型
AMQP的服務器(Broker)主要由交換器、消息、隊列組成(有些文獻歸類爲兩項:交換器與消息隊列)。Broker的主要功能是消息的路由和緩存。在RabbitMQ中,交換器分爲持久交換器、臨時交換器、自動刪除交換器。對於需要保障可靠性的消息,RabbitMQ可以將消息、隊列和交換器的數據寫入本地硬盤。而對於響應時間敏感的消息,RabbitMQ可以不配置持久化機制。
交換器(Exchange)接受來自生產者的消息,並根據不同路由算法將消息發送到消息隊列。
消息隊列(Message Queue)在消息沒有被消費者消費時將其緩存,當消費者與消息隊列連接時,消息隊列會把消息轉發給消費者。
消息(Message)是AMQP通信的基本因素。消息由Header和Body組成。與TCP/IP協議類似,Header包含的是各種屬性信息,Body是真正傳輸的數據。
交換器與消息隊列的關聯通過Binding實現。交換器與多個消息隊列Binding後會形成一張“路由表”,其中存儲的信息包括消息隊列的限制條件既Binding Key。交換器收到消息時會解析其Header中的Routing Key,根據交換類型(Exchange Type)將消息路由到消息隊列。流程以RabbitMQ官方的簡介爲例[4]:
BindingKey由消費者在Binding交換器與消息隊列時指定。Routing Key在生產者發送消息時指定。兩者的匹配方式由交換類型決定。
交換類型(Exchange Type)分爲Direct(單播,又譯爲直連式),Topic(組播,又譯爲主題式),Fanout(廣播)。對於Direct,Routing Key必須與BindingKey完全一致時匹配才成功;對於Topic,只要Routing Key符合Binding Key指定的模式,既Binding Key可以爲一個匹配模式;而對於Fanout,Routing Key和Binding Key不受任何約束。默認情況下交換類型爲Direct。
China Unix博客中的RabbitMQ專題[5]是個不錯的參考資料。
[1] http://www.amqp.org/
[2] http://www.rabbitmq.com/
[3] http://www.amqp.org/product/architecture
[4] http://www.rabbitmq.com/tutorials/amqp-concepts.html
[5] http://blog.chinaunix.net/topic/surpershi/