轉自: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隊列中獲取消息並作出相應的處理。