Ice 對象(Ice Objects)
Ice 對象是一種概念性的實體(或稱抽象)。Ice 對象具有以下特徵:
. Ice 對象是本地或遠地的地址空間中、能響應客戶請求的實體。
. 一個Ice 對象可在單個或多個伺服器中執行個體化(後者是冗餘方式)。如果
某個對象同時有多個執行個體,它仍是一個Ice 對象。
. 每個Ice對象都有一個或多個介面。 一個介面是一個對象所支援的一系列
有名稱的操作。客戶通過叫用作業來發出請求。
. 一個操作有零個或更多參數,以及一個傳回值。參數和傳回值具有明確的類型。參數是有名稱的,並且有方向:in 參數由客戶初始化,並傳給伺服器; out 參數由伺服器初始化,並傳給客戶(傳回值只是一種特
殊的out 參數)。
. 一個Ice 對象具有一個特殊的介面,稱為它的主介面。此外, Ice 對象還可以提供零個或更多其他介面,稱為facets (面)。客戶可以在某個對象的各個facets 之間進行挑選,選出它們想要使用的介面。
. 每個Ice 對象都有一個唯一的對象標識(object identity)。對象標識是用於把一個對象與其他所有對象區別開來的標識值。Ice 物件模型假定對象標識是全域唯一的,也就是說,在一個Ice 通訊域中,不會有兩個對
象具有相同的對象標識。
代理(Proxies)
要想與某個Ice 對象聯絡,客戶必須持有這個對象的代理。 代理是客戶的地址空間中的一種製品(artifact);對客戶而言,代理就是Ice 對象的代表(該對象可能在遠地)。一個代理充當的是一個Ice 對象的本地大使:
當客戶調用代理上的操作時, Ice run time 會:
1. 定位Ice 對象
2. 如果Ice 對象的伺服器沒有運行,就啟用它
3. 在伺服器中啟用Ice 對象
4. 把所有in 參數傳送給Ice 對象
5. 等待操作完成
6. 把所有out 參數及傳回值返回給客戶(或在發生錯誤的情況下拋出異常)
代理封裝了完成這一系列步驟所必需的全部資訊。特別地,代理包含有:
. 定址資訊:用於讓用戶端run time 聯絡正確的伺服器
. 對象標識:用於確定伺服器中的哪一個對象是請求的目標
. 可選的facet 標識符:用於確定代理所引用的是對象的哪一個facet
直接代理(Direct Proxies)
直接代理是這樣一種代理:其內部儲存有某個對象的標識,以及它的伺服器的運行地址。該地址由以下兩項內容完全確定:
. 協議標識符(比如TCP/IP或UDP)
. 針對具體協議的地址(比如主機名稱和連接埠號碼)
間接代理(Indirect Proxies)
間接代理是這樣一種代理:其內部儲存有某個對象的標識,以及對象適配器名(object adapter name)。要注意,間接代理沒有包含定址資訊。為了正確地定位服務器,用戶端run time 會使用代理內部的對象適配器名,將其傳給某個定位器服務,比如IcePack 服務。然後,定位器會把適配器名當作關鍵字,在含有伺服器位址的表中進行尋找,把當前的伺服器位址返回給客戶。用戶端run time 現在知道了怎樣聯絡伺服器,就會像平常一樣指派(dispatch)客戶請求。用戶端run time 會通過配置瞭解怎樣去和IcePack 服務聯絡(就像網頁瀏覽器會通過配置瞭解要使用哪一個DNS)。
Servants
Ice 對象是一種具有類型、標識,以及定址資訊的概念性實體。
在伺服器端提供操作調用的行為的製品叫作servant。一個servant 提供一個或多個Ice 對象的實質內容
實際上,servant 就是伺服器開發人員編寫的類的執行個體,這些類作為一個或多個Ice 對象的servant、向伺服器端run time 進行註冊。類的方法對應於Ice 對象的介面上的操作,並且提供這些操作的行為。
"最多一次"語義十分重要,因為這保證了非idempotent 操作可以安全使用。
idempotent 操作是這樣的操作:如果執行兩次,其效果與執行一次相同。例如, x = 1; 是idempotent 操作:如果我們兩次執行該操作,最終結果與執行一次是一樣的。另一方面, x++; 不是idempotent 操作:如果我們執行該操作兩次,最終結果與我們執行一次不一樣。
同步方法調用(Synchronous Method Invocation)
在預設情況下, Ice 使用的請求指派模型是同步的遠地程序呼叫:操作調用的行為就像是本地程序呼叫,也就是說,在調用期間,客戶線程被掛起,並在調用完成(及它的所有結果可用)時恢複。
非同步方法呼叫調用(Asynchronous Method Invocation)
Ice 還支援非同步方法呼叫調用(AMI):客戶可以非同步地叫用作業,也就是說,客戶像平常一樣使用代理來叫用作業,但除了傳遞通常的參數以外,還要傳遞一個回調對象,而客戶調用會立即返回。一旦操作完成,用戶端
端run time 會調用一開始所傳遞的回調對象上的方法,把操作的結果傳給該對象(或在失敗時傳遞異常資訊)。伺服器無法區分非同步呼叫和同步調用——無論是哪種情況,伺服器看到的都只是客戶調用了某個對象上的操作。
非同步方法呼叫指派(Asynchronous Method Dispatch)
非同步方法呼叫指派(AMD)是AMI 的伺服器端等價物。採用非同步方法呼叫指派,當操作調用到達時,伺服器端應用代碼會收到通知。但是,伺服器端應用不會被迫立即處理請求,而是可以選擇延緩處理,從而釋放用於處理該請求的執行線程。至此,伺服器端應用代碼就可以隨意做它想做的任何事情了。最後,當操作的結果可用時,伺服器端應用代碼可以發出一個API 呼叫,告訴伺服器端Ice run time,先前指派的某個請求現在已經完成;這時,操作的結果就會返回給客戶。
採用非同步指派,數百或數千客戶可以阻塞在同一個操作調用中,而又不用在伺服器中佔用任何線程。
單向方法調用(Oneway Method Invocation)
通訊資料只會從客戶流向伺服器,而不會反向流動。只有對沒有傳回值、沒有輸出參數、也不拋出使用者異常的操作 ,才能進行單向調用。
成批的單向方法調用(Batched Oneway Method Invocation)
每個單向調用都會向伺服器發送一條單獨的訊息。如果是一系列短小的訊息,這樣做的開銷相當可觀:客戶和伺服器端run time 必須為了每一條訊息、在使用者模式與核心模式之間切換,同時,在網路層,每條訊息還會帶來流量控制和確認開銷。成批的單向調用允許你在一條訊息中發送一系列單向調用:每次你調用一個這樣的單向操作,調用都會緩衝在用戶端run time 中。一旦你累積了所有你想要發送的單向調用,你就發出另外一個API 呼叫,一次發送所有調用。
資料報調用(Datagram Invocations)
資料報調用具有與單向調用類似的“儘力”語義。但資料報調用要求對象提供UDP 作為傳輸機制(而單向調用要求提供TCP/IP)
資料報和單向調用一樣是不可靠的。但與單向調用不同,資料報調用可能會發生另外一些錯誤:資料報調用很適用於LAN 上的小訊息,在LAN 上,丟失的可能性很小。它們也適用於低延遲比可靠性更重要的情形,比如快速的互動式Internet 應用。
成批的資料報調用(Batched Datagram Invocations)
屬性(Properties)
Ice run time 有大量功能都是通過屬性來配置的。屬性就是“名-值”對,比如Ice.Default.Protocol=tcp。屬性通常儲存在文字檔中,Ice run time 會對其進行解析,從而配置各種選項,比如線程池尺寸、追蹤層級,以及各種其他的配置參數。
例子hello目錄下的config檔案,就配置各種屬性。
以上是從中文文檔中對一些我想比較重要的部分摘抄下來的,其中有幾個要點:
1)ice run time
這是ice的核心,客戶調用本地代理時,ice run time會開始工作,完成一系列幕後的工作,對使用者來說是透明的,各種語言的映射也要由run time來轉換。
2)ice對象
以後我在學習slice時,應該可以對ice對象有個更清晰的認識,現在只需知道:Ice 對象是一種具有類型、標識,以及定址資訊的概念性實體。
3)調用模型
Ice提供了同步調用,非同步呼叫,單向調用,資料報調用,批調用,指派模型,線程。這裡最關鍵的是非同步兩個字,非同步實現使得對大量使用者的響應成為可能。
4)繫結模式
直接綁定,間接綁定,這實際就是怎樣定位對象的位置。類似corba中的naming service。