1. 程式人生 > >AMQP高階訊息佇列協議

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概念。