AMQP高階訊息佇列協議
AMQP,即Advanced Message Queuing Protocol,一個提供統一訊息服務的應用層標準高階訊息佇列協議,是應用層協議的一個開放標準,為面向訊息的中介軟體設計。基於此協議的客戶端與訊息中介軟體可傳遞訊息,並不受客戶端/中介軟體不同產品,不同的開發語言等條件的限制。Erlang中的實現有 RabbitMQ等。
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的標準術語。
摩根大通和iMatrix開始著手Advanced Message Queuing Protocol (AMQP)開放標準的開發。2006年,AMQP規範釋出。2007年,Rabbit技術公司基於AMQP標準開發的RabbitMQ 1.0 釋出。
目前RabbitMQ的最新版本為3.5.7,基於AMQP 0-9-1。
RabbitMQ採用Erlang語言開發。Erlang語言由Ericson設計,專門為開發concurrent和distribution系統的一種語言,在電信領域使用廣泛。OTP(Open Telecom Platform)作為Erlang語言的一部分,包含了很多基於Erlang開發的中介軟體/庫/工具,如mnesia/SASL,極大方便了Erlang應用的開發。OTP就類似於Python語言中眾多的module,使用者藉助這些module可以很方便的開發應用。
- Broker: 接收和分發訊息的應用,RabbitMQ Server就是Message Broker。
- Virtual host: 出於多租戶和安全因素設計的,把AMQP的基本元件劃分到一個虛擬的分組中,類似於網路中的namespace概念。當多個不同的使用者使用同一個RabbitMQ server提供的服務時,可以劃分出多個vhost,每個使用者在自己的vhost建立exchange/queue等。
- Connection: publisher/consumer和broker之間的TCP連線。斷開連線的操作只會在client端進行,Broker不會斷開連線,除非出現網路故障或broker服務出現問題。
- Channel: 如果每一次訪問RabbitMQ都建立一個Connection,在訊息量大的時候建立TCP Connection的開銷將是巨大的,效率也較低。Channel是在connection內部建立的邏輯連線,如果應用程式支援多執行緒,通常每個thread建立單獨的channel進行通訊,AMQP method包含了channel id幫助客戶端和message broker識別channel,所以channel之間是完全隔離的。Channel作為輕量級的Connection極大減少了作業系統建立TCP connection的開銷。
- Exchange: message到達broker的第一站,根據分發規則,匹配查詢表中的routing key,分發訊息到queue中去。常用的型別有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。
- Queue: 訊息最終被送到這裡等待consumer取走。一個message可以被同時拷貝到多個queue中。
- Binding: exchange和queue之間的虛擬連線,binding中可以包含routing key。Binding資訊被儲存到exchange中的查詢表中,用於message的分發依據。
生產者傳送訊息到broker server(RabbitMQ)。在Broker內部,使用者建立Exchange/Queue,通過Binding規則將兩者聯絡在一起。Exchange分發訊息,根據型別/binding的不同分發策略有區別。訊息最後來到Queue中,等待消費者取走。
Exchange有多種型別,最常用的是Direct/Fanout/Topic三種類型。
Direct
Message中的“routing key”如果和Binding中的“binding key”一致, Direct exchange則將message發到對應的queue中。
Fanout
每個發到Fanout型別Exchange的message都會分到所有繫結的queue上去。
Topic
根據routing key,及通配規則,Topic exchange將分發到目標queue中。
Routing key中可以包含兩種萬用字元,類似於正則表示式:
“#”通配任何零個或多個word
“*”通配任何單個word
http://tryrabbitmq.com/ 它提供線上RabbitMQ 模擬器,可以幫助理解Exchange/queue/binding概念。