Servant定位器
之前 介紹了ASM表(servant活動映射表)的作用。不過他也會有一些限制,因為如果是使用適配器的ASM來把Ice對象映射到servents,那麼會有一些影響:(1)每個Ice對象都有一個不同的servant代表。(2)所有Ice對象的所有servants都永久性的出在記憶體中。如果有大量的上servant對象的話,那麼伺服器將會承受大的壓力,或許是記憶體不夠,或許是初始化所有servants的時間很長。
1. locator綜述
Servant定位器是一種本機物件,我們負責實現它,並把它息道對象適配器上。適配器一旦有了servant定位器,它可以和平常一樣查詢ASM,對servant進行定位。如果ASM上能找到相對應的servant,請求就會指派給這個servant。如果找不到的話,對象適配器就會回調servant定位器,它為該請求提供servant。Servant定位器會做一下事情中的一件:
--初始化一個servant,把它傳給Ice run time,這種情況下,請求會被指派到這個新執行個體化的servant。
--servant定位器告訴Ice run time,他沒有找到相應的servant。這種情況下,客戶會受到ObjectNotExistException的異常。
採用這種簡單的機制,我們的伺服器能讓我們訪問數量不限的Ice對象:伺服器不必為每一個現有的Ice對象執行個體化一個單獨的servant。提供資料庫訪問的伺服器常常使用servant定位器:資料庫中的條目數通常遠遠大於伺服器在記憶體中能夠儲存的條目數。用於進程式控制制或網路管理的伺服器也常常會使用servant定位器。
2. Servant定位器介面
module Ice {
local interface ServantLocator {
Object locate( Current curr,out LocalObject cookie);
void finished( Current curr,Object servant,LocalObject cookie);
void deactivate();
};
};
ServantLocator是一個本地介面。為了建立實際的servant定位器實現,我們必須定義一個從Ice::ServantLocator派生的類,並實現locate,finised以及deactivate操作。
locate:只要有請求到達,而且他在ASM中沒有對應的條目,Ice run time就會調用locate。
finished:一旦請求完成,Ice run time就會調用finished,把完成了操作的servant、該請求的Current對象以及locate在一開始建立的cookie傳給它。這意味著,每一個locate都會有一個對應的finished。
Deactivate:當servant定位器所屬的對象適配器接解除啟用時,Ice run time會調用deactivate操作。
3. 針對Servant定位器的線程保證
在必要時,我們必須使用互斥原語,在locate和finished中對共用資料進行保護。
4. Servant定位器的註冊
對象適配器不會自動的瞭解到一個servant定位器,我們要顯式地向對象適配器註冊servant定位器。
module Ice {
local interface ObjectAdapter {
// ...
void addServantLocator(ServantLocator locator,
string category);
ServantLocator findServantLocator(string category);
// ...
};
};
由上可以看出對象適配器允許我們增加和尋找servant定位器。以下是servant定位器的簡易功能流程示意圖:
5. 使用cookies
有時,我們需要在locate與finished之間傳遞資訊。例如,locate的實現可以根據負載或可用性,從多種資料庫後端選取一種;同時,為了適當執行結束工作,finished的實現可能需要知道locate使用的是哪一種資料庫;在操作調用完成之後,Ice run time會把這個cookie的值傳給finished。
Cookie必須從Ice::LocalObject派生,可以容納任何對我們的實現有用的狀態和成員函數。