物聯網通信協議——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三種類型。

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協議中的重要概念做了一個完整的介紹,接下來,我們將從RabbitMQ集群,從運維角度看RabbitMQ,RabbitMQ是如何支撐千台節點OpenStack環境這些方面進行深入討論。 

作者:石奎,EasyStack高級架構師,曾任職WindRiver/EMC/華為等知名企業,十余年Linux操作系統定制開發及Kernel驅動開發經驗,2012年開始貢獻OpenStack社區,曾參與設計並實施國內金融領域首個支撐核心生產系統高可靠、高可用OpenStack雲平台,具有豐富的超大規模OpenStack雲平台的設計與實施經驗,去年開始深入研究NFV領域技術及項目設計實施。

本文來自easystack授權發布


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com