CORBA對象生命周期之生命周期的評估
評估準則
我們已經地討論了CORBA對象的生命周期,包括生命周期事件,對早期和后期綁定的討論,以及CORBA對象實現的一般分類。顯然,用戶希望ORB提供的應用程序能支持所有這些CORBA對象生命周期不同方面的有效實現。ORB通過對象適配器(OA)來提供這種支持。下面定義了一系列的評估準則,通過這些準則可對對象適配器進行涉及CORBA對象生命周期有效支持的分析。然后用戶采納這些不同的評估準則,并把它們應用到BOA和POA代的對象適配器中。
·適配器結構-- 最為重要的方面是適配器的一般結構。
·對象標識-- CORBA系統中的對象標識不是小問題,必須仔細檢驗特定的ORB代如何為CORBA對象支持對象標識的概念。
·早期綁定-- 用戶需要檢驗不同ORB代支持早期綁定的方式。這里值得注意的是綁定和伺服對象創建相互間有多大程度的關聯。
·后期綁定-- 不同ORB為后期綁定提供的機制必須要檢驗,特別是關于用來支持持久對象的應用程序的有用性。
·無狀態伺服對象-- 用戶想要檢驗ORB代為實現無狀態伺服對象而提供的支持。思路是對于無狀態伺服對象,用戶并不真正需要每個CORBA對象代表一個伺服對象實例-- 一個單獨的伺服對象可以作為多個CORBA對象的瞬態膠囊,并在每個請求的基礎上設定一個特別CORBA對象的標識。
·有狀態伺服對象-- 正如前面討論過的,對于有狀態伺服對象,確保用戶不必為每個請求重新激活這些伺服對象,并且激活伺服對象未超過某一閾值,這通常是很重要的。
評估BOA代
下面想在上述定義的每個與對象生命周期相關的評估準則下探討基本對象適配器,說明對可移植對象適配器完成的工作。
1. BOA 體系結構
前面提過,BOA體系結構在很多方面是極其模糊的。應用程序要求用來有效管理對象生命周期的很多特征都不夠具體。BOA定義了一些激活CORBA服務器和CORBA對象實現的函數。不幸的是,BOA側重于服務器激活,而不是像后期綁定和動態對象激活這些重要的問題。BOA還為對象引用的生成和解釋定義了一些函數。BOA隱含了伺服對象和CORBA對象間的一對一關系,即對于特定服務器支持的每個CORBA對象要求有一專用的伺服對象實例。
因為BOA規范過于模糊,所以本文使用IONA Technologies Orbix 2.x ORB作為參考實現。同樣,我們的目的不是要給出不同BOA代ORB的全面比較,而是使用ORB作為例子來討論一般的概念。
2. 對象標識
BOA代的ORB把對象引用和創建時的引用數據相關聯。引用數據是8位位組序列,并由ORB控制。這就使在遵循CORBA的方式中提供應用程序定義的對象I D變得困難。Orbix ORB提供了_marker() API來為CORBA對象指明應用程序定義的引用數據。marker是一字符串,由應用程序提供,并作為引用數據的一部分由ORB存儲。
3. 早期綁定
如前所述,大多數BOA代ORB在客戶端樁類層次和服務器端框架類層次之間提供了緊密的耦合。這樣做的結果是伺服對象的創建通常會間接導致對象的激活,因為伺服對象繼承了構造方法,這個構造方法能間接在伺服對象和ORB運行時模塊之間創建綁定。這就暗示,如果用戶想把對象引用返回給客戶機,也就要創建和激活伺服對象實例,即使用早期綁定。
4. 后期綁定
BOA結構并沒有定義ORB和應用程序之間如何交互以支持后期綁定,或是通過命令進行對象激活。因此,本文把Orbix ORB作為BOA ORB如何論述這個問題的例子。
Orbix ORB使用圖3所示的裝載器機制來支持后期綁定。如前所述,裝載器扮演伺服對象管理器的角色。基本思想是應用程序把裝載器實例注冊到ORB運行時模塊。ORB運行時模塊在對象故障的情況下依次激活裝載器上的load( )方法。這就給了裝載器一個機會來激活請求對象,這樣ORB就可以分派它。
應用程序的職責是決定伺服對象是只為特定的請求服務還是為后面的請求繼續保持激活。ORB i x裝載器特征可被應用程序用來實現為對象伺服對象池模式,而這些對象可用命令,即持久對象激活。
5. 無狀態伺服對象
BOA代ORB實現并沒有為無狀態伺服對象提供特別的支持。基本上, CORBA對象和伺服對象之間一對一的關系暗示著必須為每個CORBA對象激活一個伺服對象。根據實例化和激活一無狀態伺服對象的花費,用戶要決定它是否值得實現為池模式,以減少對象激活/凍結的次數。這包括調查由ORB強加的伺服對象激活和凍結的開銷,以及和應用程序相關的花費。問題在于從性能的角度來看是在每個請求的基礎上激活伺服對象昂貴,還是維護一對象池昂貴。
6. 有狀態伺服對象
前面討論過,對于有狀態的伺服對象,伺服對象的激活/凍結是很昂貴的,特別是如果它包括了數據庫的查找。在這種情況下,把后期綁定和對象池結合起來就很有意義。因為BOA規范在這里不是很明確,所以必須為后期綁定而依賴于專有的ORB支持,象ORBix裝載器。
評估POA代
現在把評估準則應用到可移植對象適配器。
1. POA體系結構
POA體系結構在開始時可算是占絕對優勢的,因為它為管理伺服對象和CORBA對象提供了很多先進的特性。幸運的是,以很簡單的方式來開始使用POA是可能的。但是,不同對象類型的不同需求確實需要POA的高級支持機制。
圖4給出了POA結構頂層元素的概述。ORB通過POA來管理伺服對象。每個ORB和一個POA關聯。通過調用POA上的create_POA( )并傳遞新POA的名字,POA可用來創建嵌套的POA,這是創建新POA的唯一方法,意味著應用程序不能提供它自己的POA實現。相反,應用程序通過把新POA和一系列策略關聯來定義新POA的具體行為。這些策略根據如伺服對象激活、伺服對象生命期限、I D管理和線程分配等事項來定義POA的行為。
圖5給出了POA和伺服對象之間關系的概述。POA規范采用術語"化身" (incarnation)來指出伺服對象和CORBA對象的關聯。在類圖中,可以看到這個化身關系,它由對象I D來完成,即POA可通過相關聯的對象I D來定位伺服對象。顯然,每個POA可以和多個伺服對象相關聯。令人驚奇的是一個單獨的伺服對象可代表多個CORBA對象!事實上,為多個對象注冊一個伺服對象不僅是可能的,甚至注冊一個缺省的伺服對象,用來獲取沒有通過I D而和伺服對象明確相關聯的對象的所有請求也是可能的。本文會在下面討論這個特征的有用性。POA規范還引入了術語"神化(etherealize)",它是化身的反義。這就是把伺服對象與CORBA對象間的關聯取消的操作。
2. 對象標識
CORBA的POA代對術語"對象關鍵字"和對象ID有明確的區分。對象關鍵字在通信結束點標識對象。例如,對象關鍵字可含有POA的名字,通過這個名字可到達目標對象實現。另外,對象關鍵字還可包含一對象ID。對象ID標識和具體POA相關的對象。根據特定的POA策略,新創建對象的ID可由POA或應用程序定義。
3. 早期綁定
為了使用POA的早期綁定,要以明確的激活來使用稱為伺服對象保留的策略(用activate_object( )或activate_object_with_id( ))。
要注意, POA規范把伺服對象的激活和對象引用的創建相隔離。現在把對象引用返回給客戶機并不一定意味著服務器必須激活對象;即用戶沒有執行早期綁定也可以返回對象引用。這意味著用戶可以更多地使用后期綁定。當使用無狀態服務器和代表所有無狀態伺服對象的單獨伺服對象的結合時,就會有好處;在這種情況下,用戶只需實例化一個單獨的伺服對象,并把它作為缺省的伺服對象注冊。缺省的伺服對象會為所有對象處理即將到來的請求,我們只要簡單地創建和輸出這些對象的引用就能使它們變為可用。
4. 后期綁定
POA支持伺服對象管理器的概念作為后期綁定的基礎機制,如圖6所描述。在對象故障的情況下, POA會激發注冊的伺服對象管理器,試圖獲取請求對象的化身。這意味著伺服對象和CORBA對象間的綁定只為特定的請求而創建(當使用伺服對象定位器時),或者綁定會比請求期存在得更久(當使用伺服對象激活器時)。

5. 無狀態伺服對象
POA規范以兩種方式提供對無狀態伺服對象的支持。首先,應用程序可注冊一個缺省的伺服對象,它可以為所有通過特定POA能訪問到的對象處理到來的請求。其次,可以使用伺服對象定位器:伺服對象定位器使伺服對象只在請求期間對POA可用。這意味著伺服對象會在請求期間采用一個特定的ID。POA提供一個API,使伺服對象在執行請求時能找出它自己當前的識別。
6. 有狀態伺服對象
如前面所討論的,對于有狀態伺服對象,用戶通常想維護激活伺服對象的池來減少花費巨大的激活的次數。一個重要的問題是誰來實際維護CORBA對象到伺服對象的映射。圖5指出了伺服對象通過它的ID和POA關聯。但是情況并不總是如此。有了伺服對象定位器機制,用戶可以在每個請求的基礎上創建對象/伺服對象關聯。注意伺服對象定位器通常在ORB的控制之外來管理自己的對象ID/伺服對象映射。這是實現有效的驅逐機制的最簡易方法。
從上面的討論中,我們可以看出,BOA規范經常是很模糊的,并沒有表達很多要求用來有效管理遠程激發和CORBA對象生命周期的特性。POA規范初看上去過于復雜,但另一方面, POA規范覆蓋了很多BOA代ORB以專有方式實現的特性,而這些特性并沒有被BOA規范所覆蓋。最后,開發者可用簡單的方式來使用POA,以后根據需要可利用更多的特性。
我們已經地討論了CORBA對象的生命周期,包括生命周期事件,對早期和后期綁定的討論,以及CORBA對象實現的一般分類。顯然,用戶希望ORB提供的應用程序能支持所有這些CORBA對象生命周期不同方面的有效實現。ORB通過對象適配器(OA)來提供這種支持。下面定義了一系列的評估準則,通過這些準則可對對象適配器進行涉及CORBA對象生命周期有效支持的分析。然后用戶采納這些不同的評估準則,并把它們應用到BOA和POA代的對象適配器中。
·適配器結構-- 最為重要的方面是適配器的一般結構。
·對象標識-- CORBA系統中的對象標識不是小問題,必須仔細檢驗特定的ORB代如何為CORBA對象支持對象標識的概念。
·早期綁定-- 用戶需要檢驗不同ORB代支持早期綁定的方式。這里值得注意的是綁定和伺服對象創建相互間有多大程度的關聯。
·后期綁定-- 不同ORB為后期綁定提供的機制必須要檢驗,特別是關于用來支持持久對象的應用程序的有用性。
·無狀態伺服對象-- 用戶想要檢驗ORB代為實現無狀態伺服對象而提供的支持。思路是對于無狀態伺服對象,用戶并不真正需要每個CORBA對象代表一個伺服對象實例-- 一個單獨的伺服對象可以作為多個CORBA對象的瞬態膠囊,并在每個請求的基礎上設定一個特別CORBA對象的標識。
·有狀態伺服對象-- 正如前面討論過的,對于有狀態伺服對象,確保用戶不必為每個請求重新激活這些伺服對象,并且激活伺服對象未超過某一閾值,這通常是很重要的。
評估BOA代
下面想在上述定義的每個與對象生命周期相關的評估準則下探討基本對象適配器,說明對可移植對象適配器完成的工作。
1. BOA 體系結構
前面提過,BOA體系結構在很多方面是極其模糊的。應用程序要求用來有效管理對象生命周期的很多特征都不夠具體。BOA定義了一些激活CORBA服務器和CORBA對象實現的函數。不幸的是,BOA側重于服務器激活,而不是像后期綁定和動態對象激活這些重要的問題。BOA還為對象引用的生成和解釋定義了一些函數。BOA隱含了伺服對象和CORBA對象間的一對一關系,即對于特定服務器支持的每個CORBA對象要求有一專用的伺服對象實例。
因為BOA規范過于模糊,所以本文使用IONA Technologies Orbix 2.x ORB作為參考實現。同樣,我們的目的不是要給出不同BOA代ORB的全面比較,而是使用ORB作為例子來討論一般的概念。
2. 對象標識
BOA代的ORB把對象引用和創建時的引用數據相關聯。引用數據是8位位組序列,并由ORB控制。這就使在遵循CORBA的方式中提供應用程序定義的對象I D變得困難。Orbix ORB提供了_marker() API來為CORBA對象指明應用程序定義的引用數據。marker是一字符串,由應用程序提供,并作為引用數據的一部分由ORB存儲。
3. 早期綁定
如前所述,大多數BOA代ORB在客戶端樁類層次和服務器端框架類層次之間提供了緊密的耦合。這樣做的結果是伺服對象的創建通常會間接導致對象的激活,因為伺服對象繼承了構造方法,這個構造方法能間接在伺服對象和ORB運行時模塊之間創建綁定。這就暗示,如果用戶想把對象引用返回給客戶機,也就要創建和激活伺服對象實例,即使用早期綁定。
4. 后期綁定
BOA結構并沒有定義ORB和應用程序之間如何交互以支持后期綁定,或是通過命令進行對象激活。因此,本文把Orbix ORB作為BOA ORB如何論述這個問題的例子。
Orbix ORB使用圖3所示的裝載器機制來支持后期綁定。如前所述,裝載器扮演伺服對象管理器的角色。基本思想是應用程序把裝載器實例注冊到ORB運行時模塊。ORB運行時模塊在對象故障的情況下依次激活裝載器上的load( )方法。這就給了裝載器一個機會來激活請求對象,這樣ORB就可以分派它。
![]() |
應用程序的職責是決定伺服對象是只為特定的請求服務還是為后面的請求繼續保持激活。ORB i x裝載器特征可被應用程序用來實現為對象伺服對象池模式,而這些對象可用命令,即持久對象激活。
5. 無狀態伺服對象
BOA代ORB實現并沒有為無狀態伺服對象提供特別的支持。基本上, CORBA對象和伺服對象之間一對一的關系暗示著必須為每個CORBA對象激活一個伺服對象。根據實例化和激活一無狀態伺服對象的花費,用戶要決定它是否值得實現為池模式,以減少對象激活/凍結的次數。這包括調查由ORB強加的伺服對象激活和凍結的開銷,以及和應用程序相關的花費。問題在于從性能的角度來看是在每個請求的基礎上激活伺服對象昂貴,還是維護一對象池昂貴。
6. 有狀態伺服對象
前面討論過,對于有狀態的伺服對象,伺服對象的激活/凍結是很昂貴的,特別是如果它包括了數據庫的查找。在這種情況下,把后期綁定和對象池結合起來就很有意義。因為BOA規范在這里不是很明確,所以必須為后期綁定而依賴于專有的ORB支持,象ORBix裝載器。
評估POA代
現在把評估準則應用到可移植對象適配器。
1. POA體系結構
POA體系結構在開始時可算是占絕對優勢的,因為它為管理伺服對象和CORBA對象提供了很多先進的特性。幸運的是,以很簡單的方式來開始使用POA是可能的。但是,不同對象類型的不同需求確實需要POA的高級支持機制。
![]() |
圖4給出了POA結構頂層元素的概述。ORB通過POA來管理伺服對象。每個ORB和一個POA關聯。通過調用POA上的create_POA( )并傳遞新POA的名字,POA可用來創建嵌套的POA,這是創建新POA的唯一方法,意味著應用程序不能提供它自己的POA實現。相反,應用程序通過把新POA和一系列策略關聯來定義新POA的具體行為。這些策略根據如伺服對象激活、伺服對象生命期限、I D管理和線程分配等事項來定義POA的行為。
![]() |
圖5給出了POA和伺服對象之間關系的概述。POA規范采用術語"化身" (incarnation)來指出伺服對象和CORBA對象的關聯。在類圖中,可以看到這個化身關系,它由對象I D來完成,即POA可通過相關聯的對象I D來定位伺服對象。顯然,每個POA可以和多個伺服對象相關聯。令人驚奇的是一個單獨的伺服對象可代表多個CORBA對象!事實上,為多個對象注冊一個伺服對象不僅是可能的,甚至注冊一個缺省的伺服對象,用來獲取沒有通過I D而和伺服對象明確相關聯的對象的所有請求也是可能的。本文會在下面討論這個特征的有用性。POA規范還引入了術語"神化(etherealize)",它是化身的反義。這就是把伺服對象與CORBA對象間的關聯取消的操作。
2. 對象標識
CORBA的POA代對術語"對象關鍵字"和對象ID有明確的區分。對象關鍵字在通信結束點標識對象。例如,對象關鍵字可含有POA的名字,通過這個名字可到達目標對象實現。另外,對象關鍵字還可包含一對象ID。對象ID標識和具體POA相關的對象。根據特定的POA策略,新創建對象的ID可由POA或應用程序定義。
3. 早期綁定
為了使用POA的早期綁定,要以明確的激活來使用稱為伺服對象保留的策略(用activate_object( )或activate_object_with_id( ))。
要注意, POA規范把伺服對象的激活和對象引用的創建相隔離。現在把對象引用返回給客戶機并不一定意味著服務器必須激活對象;即用戶沒有執行早期綁定也可以返回對象引用。這意味著用戶可以更多地使用后期綁定。當使用無狀態服務器和代表所有無狀態伺服對象的單獨伺服對象的結合時,就會有好處;在這種情況下,用戶只需實例化一個單獨的伺服對象,并把它作為缺省的伺服對象注冊。缺省的伺服對象會為所有對象處理即將到來的請求,我們只要簡單地創建和輸出這些對象的引用就能使它們變為可用。
4. 后期綁定
POA支持伺服對象管理器的概念作為后期綁定的基礎機制,如圖6所描述。在對象故障的情況下, POA會激發注冊的伺服對象管理器,試圖獲取請求對象的化身。這意味著伺服對象和CORBA對象間的綁定只為特定的請求而創建(當使用伺服對象定位器時),或者綁定會比請求期存在得更久(當使用伺服對象激活器時)。

5. 無狀態伺服對象
POA規范以兩種方式提供對無狀態伺服對象的支持。首先,應用程序可注冊一個缺省的伺服對象,它可以為所有通過特定POA能訪問到的對象處理到來的請求。其次,可以使用伺服對象定位器:伺服對象定位器使伺服對象只在請求期間對POA可用。這意味著伺服對象會在請求期間采用一個特定的ID。POA提供一個API,使伺服對象在執行請求時能找出它自己當前的識別。
6. 有狀態伺服對象
如前面所討論的,對于有狀態伺服對象,用戶通常想維護激活伺服對象的池來減少花費巨大的激活的次數。一個重要的問題是誰來實際維護CORBA對象到伺服對象的映射。圖5指出了伺服對象通過它的ID和POA關聯。但是情況并不總是如此。有了伺服對象定位器機制,用戶可以在每個請求的基礎上創建對象/伺服對象關聯。注意伺服對象定位器通常在ORB的控制之外來管理自己的對象ID/伺服對象映射。這是實現有效的驅逐機制的最簡易方法。
從上面的討論中,我們可以看出,BOA規范經常是很模糊的,并沒有表達很多要求用來有效管理遠程激發和CORBA對象生命周期的特性。POA規范初看上去過于復雜,但另一方面, POA規范覆蓋了很多BOA代ORB以專有方式實現的特性,而這些特性并沒有被BOA規范所覆蓋。最后,開發者可用簡單的方式來使用POA,以后根據需要可利用更多的特性。


