OpenStack資料庫遠程對象模型
在OpenStack的各個服務之間有些資料庫對象是遠程操作的,遠程對象所實現的效果是:一個 A 服務中的遠程對象實例,可以由消息隊列傳送到B 服務,B 服務能夠使用這個實例,當調用實例的方法時,實際執行這個方法卻是在A 服務中。
以Instance類的實例為例,nova-conductor在收到創建虛擬機請求時生成了實例instance=Instance(),之後將instance這個資料庫對象通過消息隊列發送到了nova-compute,在nova-compute進行虛擬機創建的過程中,經常性地需要更改虛擬機的狀態,所以經常出現類似這樣的語句:
nova-compute不直接訪問資料庫,這個save() 方法,就是由nova-conductor來執行的。
具體原理
以instance的save()方法為例,有一個@base.remotable修飾
(objects/instance.py ),
remotable的定義如下,根據indirection_api的定義情況:如果有定義indirection_api,則把save()方法作為一個參數fn來運行indirection_api.object_action,如果沒有定義則運行save()。
(dist-packages/oslo_versionedobjects/base.py),
indirection_api在nova-compute服務中有賦值,而其他服務中沒有:
(cmd/compute.py )
所以:
nova-compute運行instance.save()時是把save方法以及save的參數作為參數去運行indirection_api.object_action,而其他服務則是直接運行save()。
而indirection_api.object_action的具體實現就是消息隊列的call方法。
TAG:虛擬化雲計算 |