您好,登錄后才能下訂單哦!
openstack的RPC機(jī)制之AMQP協(xié)議
一、openstack RPC通信
Openstack 的主要組件有 Nova、Cinder、Neutron、Glance 等,分別負(fù)責(zé)云平臺的計算、存儲、網(wǎng)絡(luò)資源管理。OpenStack 各組件之間是通過 REST 接口進(jìn)行相互通信,而各組件內(nèi)部則采用了RPC通信。
1、什么是RPC
RPC即Remote Procedure Call(遠(yuǎn)程方法調(diào)用),是Openstack中一種用來實現(xiàn)跨進(jìn)程(或者跨機(jī)器)的通信機(jī)制。Openstack中同項目內(nèi)(如nova, neutron, cinder…)各服務(wù)(service)均通過RPC實現(xiàn)彼此間通信。Openstack中還有另外兩種跨進(jìn)程的通信方式:數(shù)據(jù)庫和Rest API。
Openstack中服務(wù)主要以進(jìn)程的形式實現(xiàn)。也可以以線程的形式實現(xiàn),但是Python中的線程是協(xié)作模型,無法發(fā)揮系統(tǒng)中多CPU(或多CPU核心)的能力。RCP只定義了一個通信接口,其底層的實現(xiàn)可以各不相同。目前Openstack中的主要采用AMQP的實現(xiàn)滿足組件內(nèi)部的松耦合性。
2、什么是AMQP
AMQP即Advanced Message Queuing Protocol()是一種基于隊列的可靠消息服務(wù)協(xié)議,具體可參考http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol。作為一種通信協(xié)議,AMQP同樣存在多個實現(xiàn),如Apache Qpid、RabbitMQ、ZeroMQ等。
二、AMQP模型
1、AMQP概念
AMQP 是一個定義了在應(yīng)用或者組織之間傳送消息的協(xié)議的開放標(biāo)準(zhǔn) (an open standard for passing business messages between applications or organizations),它最新的版本是 1.0。AMQP 目標(biāo)在于解決在兩個應(yīng)用之間傳送消息存在的下列問題:
網(wǎng)絡(luò)是不可靠的 =>消息需要保存后再轉(zhuǎn)發(fā)并有出錯處理機(jī)制
與本地調(diào)用相比,網(wǎng)絡(luò)速度慢 =>得異步調(diào)用
應(yīng)用之間是不同的(比如不同語言實現(xiàn)、不同操作系統(tǒng)等) =>得與應(yīng)用無關(guān)
應(yīng)用會經(jīng)常變化 =>同上
AMQP 使用異步的、應(yīng)用對應(yīng)用的、二進(jìn)制數(shù)據(jù)通信來解決這些問題。
2、AMQP 模型有幾個重要的概念:
Publisher:消息發(fā)送者,將消息發(fā)送到Exchange并指明Routing Key,以便Message Queue可以正確的收到消息
Exchange:交換器,從Producer接受消息, 根據(jù)Bindings中配置的Routing key, 把消息分派到對應(yīng)的Message Queue中
Routing key:路由鍵,用于Exchange判斷哪些消息需要發(fā)送對應(yīng)的Message Queue
Bindings: 描述了Exchange和Queue之間的關(guān)系。Exchange 根據(jù)消息內(nèi)容 (routing key), 和Binding配置來決定把消息分派到哪個Queue中
Message Queue: 存儲消息, 并把消息傳遞給最終的 Consumer
Consumer:消息接受者,從Message Queue獲取消息,一個Consumer可以訂閱多個Queue, 來接受Queue中的消息
3、AMQP 定義了三種類型的 Exchange,不同類型 Exchange 實現(xiàn)不同的 routing 算法:
Direct Exchange:Point-to-Point 消息模式,消息點對點的通信模式,Direct Exchange 根據(jù) Routing Key 進(jìn)行精確匹配,只有對應(yīng)的 Message Queue 會接受到消息
Topic Exchange:Publish-Subscribe(Pub-sub)消息模式,Topic Exchange 根據(jù) Routing Key 進(jìn)行模式匹配,只要符合模式匹配的 Message Queue 都會收到消息
Fanout Exchange:廣播消息模式,Fanout Exchange 將消息轉(zhuǎn)發(fā)到所有綁定的 Message Queue
4、AMQP工作原理:
消息發(fā)布者Publisher將Message發(fā)送給Exchange并且說明Routing Key。Exchange 負(fù)責(zé)根據(jù) Message 的Routing Key和binding 的Message Queue進(jìn)行路由,將 Message 正確地轉(zhuǎn)發(fā)給相應(yīng)的 Message Queue。監(jiān)聽在 Message Queue 上的 Consumer 將會從 Queue 中讀取消息。
Routing Key 是 Exchange 轉(zhuǎn)發(fā)信息的依據(jù),因此每個消息都有一個 Routing Key 表明可以接受消息的目的地址,而每個 Message Queue 都可以通過將自己想要接收的 Routing Key 告訴 Exchange 進(jìn)行 binding,這樣 Exchange 就可以將消息正確地轉(zhuǎn)發(fā)給相應(yīng)的 Message Queue。下面的圖顯示了整體AMQP模型:
Server就是中間件服務(wù)器:它是一個接受消息的數(shù)據(jù)服務(wù)器,并主要做兩件事情,依據(jù)條件將消息路由給不同的消費(fèi)者,當(dāng)消費(fèi)者消費(fèi)速度不夠快時,它會把消息緩存在內(nèi)存或磁盤上。
在AMQP之前的服務(wù)器中,它們會通過實現(xiàn)了特定類型路由和緩存的龐大引擎來完成. AMQ模塊使用較小的模塊結(jié)合更多樣和穩(wěn)健的方案來實現(xiàn). 它把這些任務(wù)分成了兩個不同角色:
交換器, 它接受來自生產(chǎn)者的消息并將它們路由到消息隊列
消息隊列, 它存儲消息消息并把它們轉(zhuǎn)發(fā)給消費(fèi)者應(yīng)用程序
在交換器和消息隊列之間有一個明顯的界面,稱為綁定(binding)。
5、消息流
下面的圖展示了通過AMQ模塊服務(wù)器的消息流:
一個AMQP消息由一組屬性和不透明的內(nèi)容組成。一個新消息是由生產(chǎn)者應(yīng)用程序通過使用AMQP client API來創(chuàng)建的.生產(chǎn)者將“內(nèi)容”附著在消息中,并對其設(shè)置一些消息“屬性”。生產(chǎn)者使用路由信息來標(biāo)記消息,其表面上類似于地址,但幾乎可以創(chuàng)建任何模式。然后,生產(chǎn)者將消息發(fā)送到服務(wù)器上的交換器中。
當(dāng)消息到達(dá)服務(wù)器時,交換器通常會將消息路由到一級存在于服務(wù)器上的消息隊列中.如果消息不能路由,交換器會默默地丟棄或者將其返回給生產(chǎn)者. 生產(chǎn)者可以選擇如何來處理未路由消息。
單個消息可存在于多個消息隊列. 服務(wù)器可以不同方式進(jìn)行處理,如通過拷貝消息或通過引用計數(shù)器等. 這不影響互操作性。然而,當(dāng)一個消息被路由到多個消息隊列時,它在每個消息隊列上都是一樣的。沒有獨特的標(biāo)識符來區(qū)分不同的副本。
當(dāng)消息到達(dá)消息隊列時,消息隊列會通過AMQP,立即嘗試將消息傳遞給消費(fèi)者應(yīng)用程序.如果不行,消息隊列會存儲消息(按發(fā)布者要求存儲在內(nèi)存或磁盤中),并等待消費(fèi)者準(zhǔn)備好.如果沒有消費(fèi)者,消息隊列通過AMQP將消息返回給生產(chǎn)者(再次地,如果生產(chǎn)者對此有要求的話)。
當(dāng)消息隊列把消息投遞給消費(fèi)者后,它會從內(nèi)部緩沖區(qū)中刪除消息.這有可能立即發(fā)生,也有可能在消費(fèi)者應(yīng)答它已成功處理之后刪除.消費(fèi)者可選擇如何以及何時來應(yīng)答消息.同樣地, 消費(fèi)者也可以拒絕消息(一個否定應(yīng)答)。
生產(chǎn)者消息和消費(fèi)者應(yīng)答可以組成事務(wù). 當(dāng)一個應(yīng)用程序同時扮演兩種角色時,通常它會做混合工作:發(fā)送消息和發(fā)送應(yīng)答,然后提交或回滾事務(wù)。
從服務(wù)器投遞消息給消費(fèi)者,這個過程不是事務(wù)的,它只能通過消息應(yīng)答來處理。
6、交換器Exchange功能說明
交換器是一個虛擬主機(jī)內(nèi)的消息路由代理。交換器實例(我們通常稱之為“交換器”)接受消息和路由信息-主要是一個路由鍵-或者將消息傳遞到消息隊列,或到內(nèi)部服務(wù)。交換器是基于每個虛擬主機(jī)命名的。
應(yīng)用程序可以在權(quán)限范圍內(nèi)自由地創(chuàng)建、共享、使用和銷毀交換器實例。交換器可能是持久的、臨時的或自動刪除的。持久化的交換器會持續(xù)到他們被刪除,臨時的交換器會持續(xù)到服務(wù)器關(guān)閉。自動刪除的交換器直到他們不再使用。服務(wù)器提供了一組特定的交換器類型。每個交換器類型都實現(xiàn)了一個特定的匹配和算法,如下一節(jié)中定義的。AMQP只要求少量的交換器類型,并推薦了一些。此外,每個服務(wù)器實現(xiàn)可以添加自己的交換類型。
交換器可以將單個消息并發(fā)地路由到的消息隊列中。這將創(chuàng)建一個獨立消息的多個實例。
Direct交換器類型
direct 交換器按如下方式來工作:
1. 消息隊列使用路由鍵K來綁定交換器
2. 發(fā)布者使用路由鍵R來向交換器發(fā)送消息
3. 在K=R時,消息會傳遞到消息隊列中
Direct 類似于我們生活中的快遞, 填寫對方的地址, 郵局會根據(jù)唯一地址, 來投遞郵件。
1) [Producer] 在消息體中, 填寫 Routing key
2) [Exchange] 根據(jù)Routing key, 在 Binding 中查找和Routing key綁定的 Queue
3) [Exchange] 發(fā)送消息到Queue
Topic交換器類型
topic交換器類型按如下方式來工作:
1. 消息隊列使用路由模式P來綁定到交換器
2. 發(fā)布者使用路由鍵R來向交換器發(fā)送消息
3. 當(dāng)R匹配P時,消息將被傳遞到消息隊列
用于topic交換器的路由鍵必須由0個或多個由點號.分隔的單詞組成。每個單詞必須包含字母A-Z和a-z 以及數(shù)字0-9。路由模式與路由鍵遵循相同的規(guī)則,* 用于匹配單個單詞,# 用于匹配0個或多個單詞。
因此路由模式*.stock.# 會匹配路由鍵usd.stock 和eur.stock.db 但不匹配stock.nasdaq。
Topic Exchange 和Direct Exchange比較類似, 但是Topic Exchange支持模糊匹配 (#, * 等等)。
Topic 類似于我們生活中的報刊訂閱. 使用關(guān)鍵字”體育”訂閱雜志后, 郵局會把”體育周刊” 和”體育日報” 都發(fā)送給你。
1) [Producer] 在消息體中, 填寫 Routing key
2) [Exchange] 根據(jù)Routing key, 在 Binding 中, 通過模糊匹配, 查找和Routing key綁定的 Queue
3) [Exchange] 發(fā)送消息到Queue
Fanout 交換器類型
fanout交換器類型按如下方式來工作:
1. 消息隊列不使用參數(shù)來綁定交換器
2. 發(fā)布者向交換器發(fā)送消息
3. 消息無條件傳遞給消息隊列
Fanout Exchange 不需要任何 Routing key
Fanout 類似于我們生活中的廣播. 任何人無需訂閱, 都可以收聽到
Fanout Exchange 接收到消息之后, 會把消息發(fā)送給所有綁定的Queue中
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。