RabbitMQ與AMQP協議詳解

FrankYou發表於2016-03-16

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採用Erlang語言開發。Erlang語言由Ericson設計,專門為開發concurrent和distribution系統的一種語言,在電信領域使用廣泛。OTP(Open Telecom Platform)作為Erlang語言的一部分,包含了很多基於Erlang開發的中介軟體/庫/工具,如mnesia/SASL,極大方便了Erlang應用的開發。OTP就類似於Python語言中眾多的module,使用者藉助這些module可以很方便的開發應用。

2. AMQP messaging 中的基本概念
圖片描述

  • 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. 典型的“生產/消費”訊息模型
圖片描述
生產者傳送訊息到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
圖片描述
每個發到Fanout型別Exchange的message都會分到所有繫結的queue上去。

Topic
圖片描述
根據routing key,及通配規則,Topic exchange將分發到目標queue中。

Routing key中可以包含兩種萬用字元,類似於正規表示式:

#”通配任何零個或多個word
“*”通配任何單個word

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

至此,我們對於訊息佇列的發展,RabbitMQ的產生,以及AMQP協議中的重要概念做了一個完整的介紹。

相關文章