【OpenStack源碼分析之七】openstack中的RPC請求分析

轉自:http://blog.csdn.net/hhp_hhp/article/details/51497560

概述

在OpenStack各個項目中,我們通常會用到如下幾種RPC請求:

RPC.call:發送請求到消息隊列,等待返回最終結果。
RPC.cast:發送請求到消息隊列,不需要等待最終返回的結果。
RPC.Notifier:發送各類操作消息到隊列,不需要等待最終的返回結果。
RPC.call、RPC.cast一般用於同一個項目下的服務之間進行的“內部“請求;RPC.Notifier發送的操作消息,目前被ceilometer notification服務所接收。

RPC.call & RPC.cast

一般情況下,openstack各個項目之間通過RestAPI接口進行相互訪問,而項目內部服務之間則通過RPC請求的方式進行通信。

RPC.call 請求

對於RPC.call請求,藉助官方一張經典的圖來描述:
這裏寫圖片描述

以nova-compute服務調用nova-network服務分配網絡爲例:
1. nova-compute服務向消息隊列服務的compute.node隊列發送RPC請求,並等待請求的最終回覆。
2. nova-network服務通過nova exchange(topic exchange)從compute.node隊列中獲取消息並作出相應的處理。
3. nova-network服務消息處理完了之後,向reply_XXX隊列發送一條回覆消息
4. nova-compute服務通過reply_XXX exchange(direct exchange)接受從nova-network發送的RPC消息。

RPC.cast請求

對於RPC.cast請求,同樣藉助官方一張經典的圖來描述:
這裏寫圖片描述

以nova-conductor服務調用nova-compute服務build_and_run_instance爲例:
1. nova-conductor服務向消息隊列服務的compute隊列發送RPC請求,請求結束,不需要等待請求的最終回覆。
2. nova-compute服務通過nova exchange(topic exchange)從compute隊列中獲取消息並作出相應的處理。

在openstack項目中,一般情況下,RPC server端發送一個請求到消息隊列,一般只有一個消費者(及時有多個消費者)接受並處理這條消息,還有一種類型的RPC.cast請求,也稱爲fanout_cast請求,fanout_cast發送的是廣播請求,所有對應的consumer都能接收到。

RPC.Notifier

openstack中對於資源的操作,如創建虛擬機,會向向消息隊列的notifications.info,notifications.warn,notifications.error等隊列發送對應的RPC消息,而ceilometer的notification服務會充當RPC 消費者端,獲取對應的操作消息進行處理。
RPC.Notifier提供的notifier消息有如下幾種:

  • audit:審計類消息,如compute.instance.exist
  • info:正常操作消息,如compute.instance.create.end
  • warn:告警類操作消息,暫無
  • error:錯誤類操作消息,如scheduler.run_instance
  • critical:嚴重錯誤,暫無
  • sample:sample消息,ceilometer中使用

實際上openstack RPC notifier消息就是topic類型的消息,以虛擬機開始創建爲例:
1. nova-compute服務向消息隊列服務的notifications.info隊列發送RPC消息。
2. ceilometer-agent-notification服務通過nova exchange(topic exchange)從notifications.info隊列中獲取消息並作出相應的處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章