基本介紹
- 中文名:高級訊息佇列協定
- 外文名:Advanced Message Queuing Protocol
- 屬性:套用層標準協定
- 套用領域:計算機
簡介,相關協定,功能範圍,文檔結構,技術術語,
簡介
AMQP協定
第1章 概述
1.3. 摘要
1.3.1. 什麼是AMQP
高級訊息佇列協定使得遵從該規範的客戶端套用和訊息中間件伺服器的全功能互操作成為可能。
1.3.2. 為什麼要用AMQP
我們的目標是實現一種在全行業廣泛使用的標準訊息中間件技術,以便降低企業和系統集成的開銷,並且向大眾提供工業級的集成服務。
我們的宗旨是通過AMQP,讓訊息中間件的能力最終被網路本身所具有,並且通過訊息中間件的廣泛使用發展出一系列有用的應用程式。
1.3.3. AMQP的範圍
為了完全實現訊息中間件的互操作性,需要充分定義網路協定和訊息代理服務的功能語義。
因此,AMQP定義網路協定和代理服務如下:
一套確定的訊息交換功能,也就是“高級訊息交換協定模型”。AMQP模型包括一套用於路由和存儲訊息的功能模組,以及一套在這些模組之間交換訊息的規則。
一個網路線級協定(數據傳輸格式),客戶端套用可以通過這個協定與訊息代理和它實現的AMQP模型進行互動通信。
可以只實現AMQP協定規範中的的部分語義,但是我們相信明確的描述這些語義有助於理解這個協定。
相關協定
1.3.4.1. AMQP模型
我們需要明確的定義伺服器的語義,因為所有伺服器實現都應該保持這些語義的一致性,否則就無法進行互操作。
因此AMQP模型描述了一套模組化的組件以及這些組件之間進行連線的標準規則。
在伺服器中,三個主要功能模組連線成一個處理鏈完成預期的功能:
“exchange”接收發布應用程式傳送的訊息,並根據一定的規則將這些訊息路由到“訊息佇列”。
“message queue”存儲訊息,直到這些訊息被消費者安全處理完為止。
“binding”定義了exchange和message queue之間的關聯,提供路由規則。
使用這個模型我們可以很容易的模擬出存儲轉發佇列和主題訂閱這些典型的訊息中間件概念。
一個AMQP伺服器類似於郵件伺服器,exchange類似於訊息傳輸代理(email里的概念),message queue類似於信箱。Binding定義了每一個傳輸代理中的訊息路由表,發布者將訊息發給特定的傳輸代理,然後傳輸代理將這些訊息路由到信箱中,消費者從這些信箱中取出訊息。
在以前的中間件系統的套用場景中,發布者直接將訊息傳送給信箱或者郵件列表。
區別就在於用戶可以控制message queue與exchage的連線規則,這可以做很多有趣的事情,比如定義一條規則:“將所有包含這樣這樣的訊息頭的訊息都複製一份再傳送到訊息佇列中”。
AMQP模型有以下目標:
支持金融服務領域的語義要求。
支持金融服務領域所要求的性能要求。
能夠很方便的擴展新的訊息路由和佇列。
通過AMQP協定(AMQP和AMQP Protocol的是整體和部分的關係),伺服器套用可以通過編程的方式來實現具體的功能語義。
簡單而靈活。
1.3.4.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規範能夠兼容低版本的規範。
使用強斷言模型來保證應用程式的可修復性。
保持程式語言的中立性。
適宜使用代碼生成工具生成協定處理模組。
功能範圍
我們支持各種訊息交換的體系結構:
存儲轉發(多個訊息傳送者,單個訊息接收者)。
分散式事務(多個訊息傳送者,多個訊息接收者)。
發布訂閱(多個訊息傳送者,多個訊息接收者)。
基於內容的路由(多個訊息傳送者,多個訊息接收者)。
檔案傳輸佇列(多個訊息傳送者,多個訊息接收者)。
點對點連線(單個訊息傳送者,單個訊息接收者)。
文檔結構
本文檔分成兩個部分:
“概念”部分將對AMQP的概念做一個簡單的介紹,描述AMQP怎么工作,以及AMQP的用途。
“標準”部分將對AMQP的模型層、會話層的每個組成部分做精確的定義,還將定義AMQP在網路上傳輸的二進制訊息結構。
我們用IETF RFC2119中的術語定義:必須、不必、應該、不應該和可以(詳見參考資料)。
當我們討論遵從AMQP規範的伺服器的具體行為時,我們使用術語“伺服器”來表示這些伺服器。
當我們討論遵從AMQP規範的客戶端套用的具體行為時,我們使用術語“客戶端”來表示這些客戶端套用。
我們使用“端點”來表示“伺服器或者客戶端”。
除非另有說明,所有數字都是十進制的。
協定中的常量都用大寫字母的名字來表示。AMQP的實現如果需要在代碼或者文檔中定義和使用這些常量,必須用這些名字來表示。
屬性名、命令或者控制參數,以及幀欄位都用小寫字母的名字來表示。AMQP的實現必須在代碼或者文檔中與之保持一致。
1.5. 約定
1.5.1. 定義
1.5.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的主版本號用於測試和開發目的。
技術術語
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的標準術語。