天天看點

RabbitMQ與AMQP協定詳解

1. 消息隊列的曆史 

了解一件事情的來龍去脈,将不會對它感到神秘。讓我們來看看消息隊列(Message Queue)這項技術的發展曆史。

Message Queue的需求由來已久,80年代最早在金融交易中,高盛等公司采用Teknekron公司的産品,當時的Message queuing軟體叫做:the information bus(TIB)。 TIB被電信和通訊公司采用,路透社收購了Teknekron公司。之後,IBM開發了MQSeries,微軟開發了Microsoft Message Queue(MSMQ)。這些商業MQ供應商的問題是廠商鎖定,價格高昂。2001年,Java Message queuing試圖解決鎖定和互動性的問題,但對應用來說反而更加麻煩了。

于是2004年,摩根大通和iMatrix開始着手Advanced Message Queuing Protocol (AMQP)開放标準的開發。2006年,AMQP規範釋出。2007年,Rabbit技術公司基于AMQP标準開發的RabbitMQ 1.0 釋出。

目前RabbitMQ的最新版本為3.5.7,基于AMQP 0-9-1。 

RabbitMQ與AMQP協定詳解

RabbitMQ采用Erlang語言開發。Erlang語言由Ericson設計,專門為開發concurrent和distribution系統的一種語言,在電信領域使用廣泛。OTP(Open Telecom Platform)作為Erlang語言的一部分,包含了很多基于Erlang開發的中間件/庫/工具,如mnesia/SASL,極大友善了Erlang應用的開發。OTP就類似于Python語言中衆多的module,使用者借助這些module可以很友善的開發應用。

2. AMQP messaging 中的基本概念 

RabbitMQ與AMQP協定詳解

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的分發依據。

3. 典型的“生産/消費”消息模型 

RabbitMQ與AMQP協定詳解

生産者發送消息到broker server(RabbitMQ)。在Broker内部,使用者建立Exchange/Queue,通過Binding規則将兩者聯系在一起。Exchange分發消息,根據類型/binding的不同分發政策有差別。消息最後來到Queue中,等待消費者取走。

4. Exchange類型 

Exchange有多種類型,最常用的是Direct/Fanout/Topic三種類型。

Direct 

Message中的“routing key”如果和Binding中的“binding key”一緻, Direct exchange則将message發到對應的queue中。

Fanout 

RabbitMQ與AMQP協定詳解

每個發到Fanout類型Exchange的message都會分到所有綁定的queue上去。

Topic 

RabbitMQ與AMQP協定詳解

根據routing key,及通配規則,Topic exchange将分發到目标queue中。

Routing key中可以包含兩種通配符,類似于正規表達式:

這裡也推薦給想要了解RabbitMQ的同學一個網站,http://tryrabbitmq.com ,它提供線上RabbitMQ 模拟器,可以幫助了解Exchange/queue/binding概念。 

RabbitMQ與AMQP協定詳解

至此,我們對于消息隊列的發展,RabbitMQ的産生,以及AMQP協定中的重要概念做了一個完整的介紹。

繼續閱讀