- RPC.call:發(fā)送請(qǐng)求到消息隊(duì)列,等待返回最終結(jié)果。
- RPC.cast:發(fā)送請(qǐng)求到消息隊(duì)列,不需要等待最終返回的結(jié)果。


- Publisher:消息發(fā)送者,將消息發(fā)送到 Exchange。
- Message:由Header和Body組成,Header是由Publisher添加的各種屬性的集合,包括Message是否被持久化、由哪個(gè)Message Queue接受(Routing Key)、優(yōu)先級(jí)是多少等。而B(niǎo)ody是真正需要傳輸?shù)臄?shù)據(jù),它是對(duì)Server不可見(jiàn)的二進(jìn)制數(shù)據(jù)流,在傳輸過(guò)程中不受影響……
- Exchange:接收發(fā)布應(yīng)用程序發(fā)送的消息,并根據(jù)Routing Key和Binding信息、Exchange Type等參數(shù)將這些消息路由到消息隊(duì)列。
- Binding:關(guān)聯(lián)Exchange和Message Queue,提供路由規(guī)則。
- Message Queue:存儲(chǔ)消息,直到這些消息被消費(fèi)者安全處理完為止。
- Consumer:消息接受者,從 Message Queue 獲取消息。
- Direct Exchange:Point-to-Point 消息模式,Direct Exchange 根據(jù) Routing Key 進(jìn)行精確匹配,只有對(duì)應(yīng)的 Message Queue 會(huì)接收到消息。
- Topic Exchange:Publish-Subscribe(Pub-sub)消息模式,Topic Exchange 根據(jù) Routing Key 進(jìn)行模式匹配,只要符合模式匹配的 Message Queue 都會(huì)收到消息。
- Fanout Exchange:廣播消息模式,F(xiàn)anout Exchange 將消息轉(zhuǎn)發(fā)到所有綁定的 Message Queue。
- RPC.call:發(fā)送請(qǐng)求到消息隊(duì)列,等待返回最終結(jié)果。
- RPC.cast:發(fā)送請(qǐng)求到消息隊(duì)列,不需要等待最終返回的結(jié)果。

- Topic Publisher:該對(duì)象在進(jìn)行rpc.call或rpc.cast時(shí)創(chuàng)建,每個(gè)對(duì)象都會(huì)連接同一個(gè)topic類(lèi)型的交換器,消息發(fā)送完畢后對(duì)象被回收。
- Direct Publisher:該對(duì)象在進(jìn)行rpc.call調(diào)用時(shí)創(chuàng)建,用于向消息發(fā)送者返回響應(yīng)。該對(duì)象會(huì)根據(jù)接收到的消息屬性連接一個(gè)direct類(lèi)型的交換器。
- Direct Consumer:該對(duì)象在進(jìn)行rpc.call調(diào)用時(shí)創(chuàng)建,用于接收響應(yīng)消息。每一個(gè)對(duì)象都會(huì)通過(guò)一個(gè)隊(duì)列連接一個(gè)direct類(lèi)型的交換器(隊(duì)列和交換器以UUID命名)。
- Topic Consumer:該對(duì)象在內(nèi)部服務(wù)初始化時(shí)創(chuàng)建,在服務(wù)過(guò)程中一直存在。用于從隊(duì)列中接收消息,調(diào)用消息屬性中指定的函數(shù)。該對(duì)象通過(guò)一個(gè)共享隊(duì)列或一個(gè)私有隊(duì)列連接一個(gè)topic類(lèi)型的交換器。每一個(gè)內(nèi)部服務(wù)都有兩個(gè)topic consumer,一個(gè)用于rpc.cast調(diào)用(此時(shí)連接的是binding-key為“topic”的共享隊(duì)列);另一個(gè)用于rpc.call調(diào)用(此時(shí)連接的是binding-key為“topic.host”的私有隊(duì)列)。
- Topic Exchange:topic類(lèi)型交換器,每一個(gè)消息代理節(jié)點(diǎn)只有一個(gè)topic類(lèi)型的交換器。
- Direct Exchange:direct類(lèi)型的交換器,存在于rpc.call調(diào)用過(guò)程中,對(duì)于每一個(gè)rpc.call的調(diào)用,都會(huì)產(chǎn)生該對(duì)象的一個(gè)實(shí)例。
- Queue Element:消息隊(duì)列?梢怨蚕硪部梢运接小outing-key為“topic”的隊(duì)列會(huì)在相同類(lèi)型的服務(wù)中共享(如多個(gè)compute節(jié)點(diǎn)共享一個(gè)routing-key為“topic”的隊(duì)列)。
[DEFAULT] |
|
control_exchange =openstack |
(String) The default exchange under which topics are scoped. May be overridden by an exchange name specified in the transport_url option. |

- Topic Publisher向消息隊(duì)列服務(wù)發(fā)送RPC請(qǐng)求,同時(shí)初始化一個(gè)Direct Consumer等待回復(fù)消息。
- Topic Exchange “control_exchange”根據(jù)routing key將消息分發(fā)到相應(yīng)隊(duì)列后,對(duì)應(yīng)的Consumer接收消息并觸發(fā)Worker任務(wù)。
- Worker任務(wù)完成后,初始化一個(gè)Direct Publisher向消息服務(wù)器發(fā)送一條回復(fù)消息。
- Direct Exchange將消息分派到對(duì)應(yīng)的queue給等待的Direct Consumer接收處理。
圖4.rpc.cast消息流程

Openstack中除了rpc.call和rpc.cast這兩種用于組件內(nèi)部各進(jìn)程間消息處理的功能外,還可以發(fā)送相應(yīng)資源的操作通知到notifications隊(duì)列供計(jì)費(fèi)和監(jiān)控等組件使用。
[oslo_messaging_notifications] |
|
driver = [] |
(Multi-valued) The Drivers(s) to handle sending notifications. Possible values are messaging, messagingv2, routing, log, test, noop |
topics = notifications |
(List) AMQP topic used for OpenStack notifications. |
- audit:審計(jì)類(lèi)消息
- info:正常操作消息
- warn:告警類(lèi)操作消息
- error:錯(cuò)誤類(lèi)操作消息
- critical:嚴(yán)重錯(cuò)誤
- sample:sample消息


- 服務(wù)初始化時(shí)啟動(dòng)的Consumer監(jiān)聽(tīng)到隊(duì)列消息,分析并觸發(fā)Manager類(lèi)的對(duì)應(yīng)方法。
- Manager初始化并啟動(dòng)任務(wù)流flow。
- flow中的NotifyVolumeActionTask調(diào)用utils模塊中的notify_about_xxx方法,該方法初始化oslo.messaging庫(kù)中的Notifier類(lèi),并調(diào)用info方法。
- Notifier.info方法根據(jù)conf文件里的notify driver名(driver = messagingv2)和messaging driver配置(rpc_backend = rabbit)動(dòng)態(tài)加載MessagingV2Driver類(lèi)和RabbitDriver驅(qū)動(dòng)(命名空間對(duì)應(yīng)關(guān)系在項(xiàng)目代碼文件setup.cfg中的entry points段指定)。
- RabbitDriver獲取服務(wù)器連接并調(diào)用kombu庫(kù)完成消息發(fā)送。