一、概述
AMQP,即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標准高級消息隊列協議,是應用層協議的一個開放標准,為面向消息的中間件設計。基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件不同產品,不同的開發語言等條件的限制。Erlang中的實現有 RabbitMQ等。
- 中文名 : 高級消息隊列協議
- 外文名 : Advanced Message Queuing Protocol
- 屬 性 : 應用層標准協議
- 應用領域: 計算機
二、目錄
- 簡介
- 相關協議
- 功能范圍
- 文檔結構
- 技術術語
- 參考資料
1、概述
1.1、什么是AMQP
AMQP:高級消息隊列協議使得遵從該規范的客戶端應用和消息中間件服務器的全功能互操作成為可能。
1.2、為什么要用AMQP
我們的目標是實現一種在全行業廣泛使用的標准消息中間件技術,以便降低企業和系統集成的開銷,並且向大眾提供工業級的集成服務。
我們的宗旨是通過AMQP,讓消息中間件的能力最終被網絡本身所具有,並且通過消息中間件的廣泛使用發展出一系列有用的應用程序。
1.3、AMQP的范圍
為了完全實現消息中間件的互操作性,需要充分定義網絡協議和消息代理服務的功能語義。因此,AMQP定義網絡協議和代理服務如下: 一套確定的消息交換功能,也就是“高級消息交換協議模型”。
AMQP模型包括一套用於路由和存儲消息的功能模塊,以及一套在這些模塊之間交換消息的規則。一個網絡線級協議(數據傳輸格式),客戶端應用可以通過這個協議與消息代理和它實現的AMQP模型進行交互通信。可以只實現AMQP協議規范中的的部分語義,但是我們相信明確的描述這些語義有助於理解這個協議。
2、相關協議
2.1、AMQP模型
我們需要明確的定義服務器的語義,因為所有服務器實現都應該保持這些語義的一致性,否則就無法進行互操作。因此AMQP模型描述了一套模塊化的組件以及這些組件之間進行連接的標准規則。
在服務器中,三個主要功能模塊連接成一個處理鏈完成預期的功能: “exchange”接收發布應用程序發送的消息,並根據一定的規則將這些消息路由到“消息隊列”。
“message queue”存儲消息,直到這些消息被消費者安全處理完為止。 “binding”定義了exchange和message queue之間的關聯,提供路由規則。 使用這個模型我們可以很容易的模擬出存儲轉發隊列和主題訂閱這些典型的消息中間件概念。一個AMQP服務器類似於郵件服務器,exchange類似於消息傳輸代理(email里的概念),message queue類似於郵箱。
Binding定義了每一個傳輸代理中的消息路由表,發布者將消息發給特定的傳輸代理,然后傳輸代理將這些消息路由到郵箱中,消費者從這些郵箱中取出消息。
在以前的中間件系統的應用場景中,發布者直接將消息發送給郵箱或者郵件列表。 區別就在於用戶可以控制message queue與exchage的連接規則,這可以做很多有趣的事情,比如定義一條規則:“將所有包含這樣這樣的消息頭的消息都復制一份再發送到消息隊列中”。
AMQP模型有以下目標: 支持金融服務領域的語義要求。 支持金融服務領域所要求的性能要求。
能夠很方便的擴展新的消息路由和隊列。
通過AMQP協議(AMQP和AMQP Protocol的是整體和部分的關系),服務器應用可以通過編程的方式來實現具體的功能語義。 簡單而靈活。
2.2、AMQP協議
AMQP協議是一個二進制協議,擁有一些現代特點:多信道、協商式、異步、安全、跨平台、中立、高效。
AMQP通常被划分為三層: 模型層定義了一套命令(按功能分類),客戶端應用可以利用這些命令來實現它的業務功能。會話層負責將命令從客戶端應用傳遞給服務器,再將服務器的應答傳遞給客戶端應用,會話層為這個傳遞過程提供可靠性、同步機制和錯誤處理。 傳輸層提供幀處理、信道復用、錯誤檢測和數據表示。 實現者可以將傳輸層替換成任意傳輸協議,只要不改變AMQP協議中與客戶端應用程序相關的功能。實現者還可以使用其他高層協議中的會話層。
AMQP模型的設計由以下幾個需求所驅動:
- 保證遵從AMQP規范的服務器實現之間能夠進行互操作。
- 為服務質量提供顯示控制。
- 支持所有消息中間件的功能:消息交換、文件傳輸、流傳輸、遠程進程調用等。
- 兼容已有的消息API規范(比如Sun公司的JMS規范)。
- 形成一致和明確的命名。
- 通過AMQP協議可以完整的配置服務器線路(TODO:server wiring是啥意思?答:服務器連接)。
- 使用命令符號可以很容易的映射成應用級別的API。
- 明確定義每一個操作只做一件事情。
AMQP傳輸層的設計由以下幾個主要的需求所驅動,這些需求不分先后次序:
- 使用能夠快速打包解包的二進制編碼來保證數據的緊湊性。
- 能夠處理任意大小的消息。
- 允許零拷貝數據傳輸(比如遠程DMA)。
- 一個連接支持多個會話。
- 保證會話能夠從網絡錯誤、服務器失效中恢復。
- 為了長期存在,沒有隱含的內置限制(TODO:To be long-lived,with no significant in-built limitations)。
- 異步傳輸消息。
- 能夠很容易的處理新的和變化的需求。
- 高版本的AMQP規范能夠兼容低版本的規范。
- 使用強斷言模型來保證應用程序的可修復性。
- 保持編程語言的中立性。
- 適宜使用代碼生成工具生成協議處理模塊。
3、功能范圍
我們支持各種消息交換的體系結構:
- 存儲轉發(多個消息發送者,單個消息接收者)。
- 分布式事務(多個消息發送者,多個消息接收者)。
- 發布訂閱(多個消息發送者,多個消息接收者)。
- 基於內容的路由(多個消息發送者,多個消息接收者)。
- 文件傳輸隊列(多個消息發送者,多個消息接收者)。
- 點對點連接(單個消息發送者,單個消息接收者)。
4、文檔結構
4.1、本文檔分成兩個部分
“概念”部分將對AMQP的概念做一個簡單的介紹,描述AMQP怎么工作,以及AMQP的用途。
“標准”部分將對AMQP的模型層、會話層的每個組成部分做精確的定義,還將定義AMQP在網絡上傳輸的二進制消息結構。
我們用IETF RFC2119中的術語定義:必須、不必、應該、不應該和可以(詳見參考資料[1] )。
當我們討論遵從AMQP規范的服務器的具體行為時,我們使用術語“服務器”來表示這些服務器。
當我們討論遵從AMQP規范的客戶端應用的具體行為時,我們使用術語“客戶端”來表示這些客戶端應用。
我們使用“端點”來表示“服務器或者客戶端”。
除非另有說明,所有數字都是十進制的。
協議中的常量都用大寫字母的名字來表示。
AMQP的實現如果需要在代碼或者文檔中定義和使用這些常量,必須用這些名字來表示。
屬性名、命令或者控制參數,以及幀字段都用小寫字母的名字來表示。
AMQP的實現必須在代碼或者文檔中與之保持一致。
4.2. 版本號
AMQP版本用兩個版本號表示——主版本號和次版本號。我們約定版本由主版本號后面加小數點再加上次版本號組成(比如1-3表示主版本號為1,次版本號為3)。
主版本號和次版本號可以用0到255之內的所有值。
主版本號保持不變,次版本號遞增。
當AMQP工作組提升主版本號時,次版本號將被設置為0。
因此,有可能出現這樣的版本序列:1-2,1-3,1-4,2-0,2-1…… 一旦本協議發布之后(主版本號大於1),應盡量防止次版本號遞增到9。
不過在發布之前(版本0-x),由於會對本協議進行頻繁的修訂,可以不遵守這條約定。 一旦本協議發布之后(主版本號大於1),同一個主版本不同次版本的實現必須向后兼容。而在發布之前,這些次版本的實現不需要兼容。
大於或者等於99的主版本號用於測試和開發目的。
5、技術術語
- AMQP模型(AMQP Model):一個由關鍵實體和語義表示的邏輯框架,遵從AMQP規范的服務器必須提供這些實體和語義。為了實現本規范中定義的語義,客戶端可以發送命令來控制AMQP服務器。
- 連接(Connection):一個網絡連接,比如TCP/IP套接字連接。
- 會話(Session):端點之間的命名對話。在一個會話上下文中,保證“恰好傳遞一次”。
- 信道(Channel):多路復用連接中的一條獨立的雙向數據流通道。為會話提供物理傳輸介質。
- 客戶端(Client):AMQP連接或者會話的發起者。AMQP是非對稱的,客戶端生產和消費消息,服務器存儲和路由這些消息。
- 服務器(Server):接受客戶端連接,實現AMQP消息隊列和路由功能的進程。也稱為“消息代理”。
- 端點(Peer):AMQP對話的任意一方。一個AMQP連接包括兩個端點(一個是客戶端,一個是服務器)。
- 搭檔(Partner):當描述兩個端點之間的交互過程時,使用術語“搭檔”來表示“另一個”端點的簡記法。比如我們定義端點A和端點B,當它們進行通信時,端點B是端點A的搭檔,端點A是端點B的搭檔。
- 片段集(Assembly):段的有序集合,形成一個邏輯工作單元。
- 段(Segment):幀的有序集合,形成片段集中一個完整子單元。
- 幀(Frame):AMQP傳輸的一個原子單元。一個幀是一個段中的任意分片。
- 控制(Control):單向指令,AMQP規范假設這些指令的傳輸是不可靠的。
- 命令(Command):需要確認的指令,AMQP規范規定這些指令的傳輸是可靠的。
- 異常(Exception):在執行一個或者多個命令時可能發生的錯誤狀態。
- 類(Class):一批用來描述某種特定功能的AMQP命令或者控制。
- 消息頭(Header):描述消息數據屬性的一種特殊段。
- 消息體(Body):包含應用程序數據的一種特殊段。消息體段對於服務器來說完全透明——服務器不能查看或者修改消息體。
- 消息內容(Content):包含在消息體段中的的消息數據。
- 交換器(Exchange):服務器中的實體,用來接收生產者發送的消息並將這些消息路由給服務器中的隊列。
- 交換器類型(Exchange Type):基於不同路由語義的交換器類。
- 消息隊列(Message Queue):一個命名實體,用來保存消息直到發送給消費者。
- 綁定器(Binding):消息隊列和交換器之間的關聯。
- 綁定器關鍵字(Binding Key):綁定的名稱。一些交換器類型可能使用這個名稱作為定義綁定器路由行為的模式。
- 路由關鍵字(Routing Key):一個消息頭,交換器可以用這個消息頭決定如何路由某條消息。
- 持久存儲(Durable):一種服務器資源,當服務器重啟時,保存的消息數據不會丟失。
- 臨時存儲(Transient):一種服務器資源,當服務器重啟時,保存的消息數據會丟失。
- 持久化(Persistent):服務器將消息保存在可靠磁盤存儲中,當服務器重啟時,消息不會丟失。
- 非持久化(Non-Persistent):服務器將消息保存在內存中,當服務器重啟時,消息可能丟失。
- 消費者(Consumer):一個從消息隊列中請求消息的客戶端應用程序。
- 生產者(Producer):一個向交換器發布消息的客戶端應用程序。
- 虛擬主機(Virtual Host):一批交換器、消息隊列和相關對象。虛擬主機是共享相同的身份認證和加密環境的獨立服務器域。客戶端應用程序在登錄到服務器之后,可以選擇一個虛擬主機。
下面這些術語在AMQP規范的上下文中沒有特別的意義:
- 主題:通常指發布消息;AMQP規范用一種或多種交換器來實現主題。
- 服務:通常等同於服務器。AMQP規范使用“服務器”這個術語來兼容IETF的標准術語,並且明確了協議中每個部分的角色(兩方也可能是AMQP服務)。
- 消息代理:等同於服務器。AMQP規范使用術語“客戶端”和“服務器”來兼容IETF的標准術語。
6、參考資料
- Key words for use in RFCs to Indicate Requirement Levels .The Internet Engineering Task Force[引用日期2012-010-10]
- 來自百度百科(傳送門)