溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

RPC機(jī)制之AMQP協(xié)議

發(fā)布時間:2020-07-08 15:25:02 來源:網(wǎng)絡(luò) 閱讀:2156 作者:CACZJZ 欄目:開發(fā)技術(shù)

openstack的RPC機(jī)制之AMQP協(xié)議

一、openstack RPC通信

Openstack 的主要組件有 Nova、CinderNeutron、Glance 等,分別負(fù)責(zé)云平臺的計算、存儲、網(wǎng)絡(luò)資源管理。OpenStack 各組件之間是通過 REST 接口進(jìn)行相互通信,而各組件內(nèi)部則采用了RPC通信。

1什么是RPC

RPCRemote 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

AMQPAdvanced Message Queuing Protocol()是一種基于隊列的可靠消息服務(wù)協(xié)議,具體可參考http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol。作為一種通信協(xié)議,AMQP同樣存在多個實現(xiàn),如Apache Qpid、RabbitMQZeroMQ等。

二、AMQP模型

1AMQP概念

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ù)通信來解決這些問題。
2AMQP 模型有幾個重要的概念:

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: 描述了ExchangeQueue之間的關(guān)系。Exchange 根據(jù)消息內(nèi)容 (routing key), Binding配置來決定把消息分派到哪個Queue

Message Queue: 存儲消息, 并把消息傳遞給最終的 Consumer

Consumer:消息接受者,從Message Queue獲取消息,一個Consumer可以訂閱多個Queue, 來接受Queue中的消息
RPC機(jī)制之AMQP協(xié)議

RPC機(jī)制之AMQP協(xié)議

3、AMQP 定義了三種類型的 Exchange,不同類型 Exchange 實現(xiàn)不同的 routing 算法:

Direct ExchangePoint-to-Point 消息模式,消息點對點的通信模式,Direct Exchange 根據(jù) Routing Key 進(jìn)行精確匹配,只有對應(yīng)的 Message Queue 會接受到消息

Topic ExchangePublish-Subscribe(Pub-sub)消息模式,Topic Exchange 根據(jù) Routing Key 進(jìn)行模式匹配,只要符合模式匹配的 Message Queue 都會收到消息

Fanout Exchange:廣播消息模式,Fanout Exchange 將消息轉(zhuǎn)發(fā)到所有綁定的 Message Queue

4AMQP工作原理:

消息發(fā)布者PublisherMessage發(fā)送給Exchange并且說明Routing Key。Exchange 負(fù)責(zé)根據(jù) Message Routing Keybinding 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模型: RPC機(jī)制之AMQP協(xié)議

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ù)器的消息流:
RPC機(jī)制之AMQP協(xié)議RPC機(jī)制之AMQP協(xié)議

一個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時,消息會傳遞到消息隊列中
RPC機(jī)制之AMQP協(xié)議RPC機(jī)制之AMQP協(xié)議
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-Za-z 以及數(shù)字0-9。路由模式與路由鍵遵循相同的規(guī)則,* 用于匹配單個單詞,# 用于匹配0個或多個單詞。
因此路由模式*.stock.# 會匹配路由鍵usd.stock eur.stock.db 但不匹配stock.nasdaq。
RPC機(jī)制之AMQP協(xié)議RPC機(jī)制之AMQP協(xié)議
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. 消息無條件傳遞給消息隊列
RPC機(jī)制之AMQP協(xié)議RPC機(jī)制之AMQP協(xié)議
Fanout Exchange 不需要任何 Routing key
Fanout 類似于我們生活中的廣播. 任何人無需訂閱, 都可以收聽到
Fanout Exchange 接收到消息之后, 會把消息發(fā)送給所有綁定的Queue

 


向AI問一下細(xì)節(jié)

免責(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)容。

AI