Openstack 通用技術 RPC 遠端非同步呼叫

2021-09-23 01:29:05 字數 4430 閱讀 8150

測試

rpc:同乙個專案內的不同服務程序之間的互動方式。為不同的程序服務提供了call()(同步) 和cast()(非同步) 兩種呼叫方式。

問題 1:在乙個 openstack 專案中擁有多個不同的程序服務,eg. api service/manage service。 當我們通過 client 傳送 api request 去呼叫 manage service 執行乙個操作任務時,我們會希望這個呼叫的結果是能夠快速響應到 client 的(保證使用者體驗)。

問題 2:而且程序服務之間的呼叫我們還需要考慮如何有效的避免程序服務之間呼叫的阻塞問題。eg. api service 呼叫 manage service 時,如果不能及時的將 api service 釋放掉,那麼 api request 就會因為被占用,而無法處理新的請求。

對於上面兩個問題,我們可以通過將具體的執行過程響應過程分離來達到理想的效果。這也是 rpc 和 api 存在的原因之一。

包含了下列兩個過程實現:

devstack 用的 l 版,樣例在自定義的 openstack 專案中實現,詳見自動化生成 openstack 新專案開發框架。

# project/api/v1/router.py

from project.api.v1 import new_resource

class

apirouter

(octopunch.api.openstack.apirouter):

extensionmanager = extensions.extensionmanager

def_setup_routes

self.resources['versions'] = versions.create_resource()

controller=self.resources['versions'],

action='show')

self.resources['new_resource'] = new_resource.create_resource(ext_mgr)

controller=self.resources['new_resource'])

# project/api/v1/new_resource.py

class

newresourcecontroller

(wsgi.controller):

def__init__

(self, ext_mgr):

self.ext_mgr = ext_mgr

super(newresourcecontroller, self).__init__()

# create() 對應了 http 的 post 方法

@wsgi.serializers()

defcreate

(self, req, body):

"""create a newresource."""

context = req.environ['project.context']

# sync the project database.

self.new_resource_api.db_sync(context)

defcreate_resource

(ext_mgr):

"""project resource factory method."""

return wsgi.resource(newresourcecontroller(ext_mgr))

上述兩個檔案實現了通過 http request 的 post 方法來執行指定的 create() 函式。

# project/new_resource/api.py

# import rpcapi module

from project.new_resource import rpcapi as new_resource_rpcapi

class

api(base.base):

"""api for interacting with the new_resource manager."""

def__init__

(self, db_driver=none, image_service=none):

self.new_resource_rpcapi = new_resource_rpcapi.newresourceapi()

super(api, self).__init__(db_driver)

# 定義呼叫 rpcapi 的介面函式

defdb_sync

(self, context):

"""call rpc api to start db sync for new_resource database."""

self.new_resource_rpcapi.db_sync(context)

api 的存在是為了能夠快速的響應請求,至於之後的執行過程交由 rpc-api 和 manager 來處理

# project/new_resource/rpcapi.py

class

newresourceapi

(object):

def__init__

(self):

super(newresourceapi, self).__init__()

target = messaging.target(topic=conf.manage_topic,

version=self.rpc_api_version)

serializer = objects_base.projectobjectserializer()

self.client = rpc.get_client(target, version_cap='1.8',

serializer=serializer)

# 定義 rpcapi 函式,使用 cast 非同步呼叫方式

defdb_sync

(self, context):

cctxt = self.client.prepare()

# 指定 rpcapi 的呼叫方式,和指定對映到 manager.py 的處理函式

cctxt.cast(context, 'db_sync')

rpc-api 的存在是為了快速的響應程序服務之間的呼叫請求。

# project/new_resource/manager.py

class

newresourcemanager

(manager.manager):

rpc_api_version = '1.8'

target = messaging.target(version=rpc_api_version)

def__init__

(self, service_name=none, *args, **kwargs):

super(newresourcemanager, self).__init__(*args, **kwargs)

self._startup_delay = true

definit_host_with_rpc

(self):

eventlet.sleep(conf.periodic_interval)

self._startup_delay = false

defdb_sync

(self, context):

print

"這裡是具體的 rpc 操作函式"

小結

openstack 的 prc 呼叫的過程為: api.py ⇒ rpcapi.py ⇒ manager.py

詳見:openstack nova 原始碼分析 — rpc 遠端呼叫過程

-d''注意: 樣例需要根據自身開發環境進行調整,

Openstack 通用模組 Oslo

vsphere create snapshot 文件 snapshot 是虛擬機器磁碟檔案 vmdk 在某個點及時的複本。包含了虛擬機器所有虛擬磁碟上的資料狀態和這個虛擬機器的電源狀態 on off suspended 你可以在虛擬機器起電,關電,掛起的狀態下建立乙個 snapshot。當你建立了乙...

參加2012 Openstack亞太技術大會

參加2012 openstack亞太技術大會 openstack是乙個由rackspace發起 全球開發者共同參與的開源專案,旨在打造易於部署 功能豐富且易於擴充套件的雲計算平台。openstack企圖成為資料中心的作業系統,即云作業系統。從專案發起之初,openstack就幾乎贏得了所有it巨頭的...

閒聊雲服務計算技術 OpenStack

與雲服務結緣 在2012年開始,我開始和團隊搭建ecg自己的selenium grid的集群 這裡面也可以寫蠻多內容的,我自己用perl做的第乙個實際專案,未來有機會介紹給大家 最先我們是採用的vmware workstation來生成和管理我們的vm,當時機房在歐洲的amsterdam,坦白的說,...