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採用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三種類型。ui

Direct
圖片描述
Message中的「routing key」若是和Binding中的「binding key」一致, Direct exchange則將message發到對應的queue中。spa

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協議中的重要概念作了一個完整的介紹。

相關文章
相關標籤/搜索