天天看點

ICE和ACE高效網絡程式設計中間件平台

自從上世紀九十年代以來,計算工業一直在使用像DCOM 和CORBA這樣的面向對象中間件平台。

在使分布式計算能為應用開發者所用的程序中,面向對象中間件是十分重要的一步。開發者第一次擁有了這樣的可能:可以建構分布式應用——中間件平台會照管大部分網絡雜務,比如整編(marshaling)和解編(unmarshaling)(對資料進行編碼與解碼,以進行傳送)、把邏輯對象位址映射到實體傳輸端點、根據客戶和 伺服器的原生機器架構改變資料的表示,以及應需自動啟動 伺服器。然而,由于一些原因,無論是DCOM 還是CORBA,都未能成功占領大部分計算市場:(1) DCOM 是Microsoft 的獨家解決方案,在異種網絡中,各種機器會運作多種作業系統,無法使用COM。(2) DCOM 不能支援大量對象(數十萬或數百萬),這在很大程度上是它的分布式垃圾收集機制來的開銷造成的。(3) 盡管有多家供應商提供CORBA 産品,幾乎不可能找到一家供應商,能夠為異種網絡中的所有環境提供實作。盡管進行了大量标準化工作,不同的CORBA 實作之間仍缺乏互操作性,進而不斷地造成各種問題;而且,由于供應商常常會自行定義擴充,而CORBA 又缺乏針對多線程環境的規範,對于像C 或C++ 這樣的語言,源碼相容性從未完全實作過.(4) DCOM和 CORBA都過于複雜。 在異種環境中,讓DCOM 和CORBA 共存從來都不是一件容易的事情:盡管有供應商提供互操作産,這兩種平台之間的互操作從來都不是無縫的,而且難以管理,會産生互不相連的技術孤島。2002 年,Microsoft .NET 平台取代了DCOM。但盡管.NET 提供了比DCOM 更強大的分布式計算支援,它仍然是Microsoft 的獨家解決方案,因而不是異種環境下的選擇。另一方面,CORBA 近年來已停滞不前,許多供應商離開了市場,給消費者留下了不再受到廣泛支援的平台;剩下的少數供應商在進一步标準化方面的興趣也已衰退,緻使CORBA 規範中的許多缺陷未能得到解決,或是在它們被報告多年之後才得到解決。在DCOM 和CORBA 衰敗的同時,分布式計算社群對SOAP和web services産生了濃厚的興趣。使用無處不在的WWW 基礎設施和HTTP來開發中間件平台的想法十分迷人——至少在理論上。SOAP 和web services 曾經允諾要成為Internet 上的分布式計算通用語言。 但盡管引發了很大的公衆效應,發表了許多論文,web services 卻沒有能兌現其允諾:用web services 架構開發的商業系統非常少。其原因是:無論是在網絡帶寬方面,還是在CPU 開銷方面,SOAP 都會給應用造成嚴重的性能惡化,以緻于該技術無法适用于許多有苛刻性能要求的系統。盡管SOAP 提供了"on-the-wire" 規範,要開發現實的應用,那仍是不夠的,因為該規範提供的抽象層次太低。應用可以把各種SOAP 消息拼湊在一起,但這樣做極其繁瑣而易錯。缺乏更進階的抽象促使供應商提供各種應用開發平台,使遵從SOAP 的應用開發自動化。但是,除了協定一級,這些開發平台完全沒有标準化,不可避免是私有的,是以用一家供應商開發的應用無法與其他供應商的中間件産品一起使用。

關于SOAP 和web services 的架構安全性,有一些嚴重的擔憂。

這些使人不快的選擇,ZeroC, Inc. 決定開發Internet Communications Engine,簡稱Ice。Riverace公司(http://www.riverace.com)采用開放源碼商業模式對ACE進行商業支援。此外, ACE開發組的許多成員目前正在進行The ACE ORB(TAO,http://www.cs.wustl.edu/~schmidt/TAO.html)的開發工作。

ACE自适配通信環境(ADAPTIVE Communication Environment)是可自由使用、開放源碼的面向對象(OO)架構(framework),它實作了許多用于并發通信軟體的核心模式。ACE提供了一組豐富的可重用C++包裝外觀(wrapper facade)和架構元件,可跨多種平台完成通用的通信軟體任務,其中包括:事件多路分離和事件處理器分派、信号處理、服務初始化、程序間通信、共享記憶體管理、消息路由、分布式服務動态(重)配置、并發執行和同步,等等。ACE的目标使用者是高性能和實時通信服務和應用的開發者。它簡化了使用程序間通信、事件多路分離、顯式動态連結和并發的OO網絡應用和服務的開發。此外,通過服務在運作時與應用的動态連結,ACE使系統的配置和重配置得以自動化。

ICE (Internet Communications Engine)是ZeroC提供的一款高性能的中間件,基于ICE可以實作電信級的解決方案。前面我們提到過在設計網站架構的時候可以使用ICE實作對網站應用的基礎對象操作,将基礎對象操作和 資料庫操作封裝在這一層,在業務邏輯層以及表現層(java,php,.net,python)進行更豐富的表現與操作,進而實作比較好的架構。基于ICE的資料層可以在未來友善的進行擴充。ICE支援分布式的部署管理,消息中間件,以及網格計算等等。

Ice和ACE在性能與開發簡便上深化了.CORBA這是一個老牌的分布式中間件平台,并且以其标準實作困難,開發者使用困難而著稱。  Ice 采用的許多思想也能在CORBA 及以前的一些分布式計算平台中找到。在有些方面, Ice 與CORBA 非常接近,而在另外一些方面,它們的差異則意義深遠,并且在架構上有着廣泛的影響。如果你曾經使用過CORBA,了解這些差異十分重要。盡管從表面看來, Ice 對象模型與CORBA 對象模型是一樣的,但它們在一些重要方面卻有所不同。類型系統Ice 對象和CORBA 對象一樣,都隻有一個派生層次最深的(most derived) 主接口。但Ice 對象可以提供其他接口作為facets。重要的是要注意到,一個Ice 對象的所有facets 都具有相同的對象辨別,也就是說,客戶看到的是具有多個接口的單個對象,而不是看到多個對象、每個對象有不同的接口。facets 提供了極大的架構靈活性。特别地,它們為版本管理問題提供了一種解決途徑:你可以簡單地給已經存在的對象增加新的facet,輕松地擴充某個伺服器的功能,而不會破壞已有的、已經部署的客戶。代理語義Ice 代理(CORBA 對象引用的等價物) 不是不透明的。 客戶隻要知道對象的類型和辨別,無需其他系統元件的支援,就可以建立出代理(在使用間接綁定時, 不必了解對象的傳輸位址)。

ACE的好處包括:

(1)增強可移植性:在ACE元件的幫助下,很容易在一種OS平台上編寫并發網絡應用,然後快速地将它們移植到各種其他的OS平台上。而且,因為ACE是開放源碼的自由軟體,你無需擔心被鎖定在特定的作業系統平台或編譯器上。

(2)更好的軟體品質:ACE的設計使用了許多可提高軟體品質的關鍵模式,這些品質因素包括通信軟體靈活性、可擴充性、重用性和子產品性。

(3)更高的效率和可預測性:ACE經仔細設計,支援廣泛的應用服務品質(QoS)需求,包括延遲敏感應用的低響應等待時間、高帶寬應用的高性能,以及實時應用的可預測性。

(4) 更容易轉換到标準的進階中間件:TAO使用了ACE提供的可重用元件和模式。它是CORBA的開發源碼、遵循标準的實作,并為高性能和實時系統作了優化。為此,ACE和TAO被設計為能良好地協同工作,以提供全面的中間件解決方案。

ACE還包含一個進階的網絡程式設計架構,內建并增強了較低層次的C++包裝外觀。該架構支援将并發分布式服務動态配置進應用。

ACE的架構部分包含以下元件:

(1)事件多路分離元件:ACE Reactor(反應器)和Proactor(前攝器)是可擴充的面向對象多路分離器,它們分派應用專有的處理器,以響應多種類型的基于I/O、定時器、信号和同步的事件。

(2)服務初始化元件:ACE Acceptor(接受器)和Connector(連接配接器)元件分别使主動和被動的初始化任務與初始化一旦完成後通信服務所執行的應用專有的任務去耦合。

(3)服務配置元件:ACE Service Configurator(服務配置器)支援應用的配置,這些應用的服務可在安裝時和/或運作時被動态裝配。

(4)分層的流元件:ACE Stream元件簡化了像使用者級協定棧這樣的由分層服務組成的通信軟體應用的開發。

(5)ORB擴充卡元件:通過ORB擴充卡,ACE可以與單線程和多線程CORBA實作進行無縫內建。

ACE 架構元件便利了通信軟體的開發,它們無需修改、重編譯、重連結,或頻繁地重新開機運作中的應用,就可被更新和擴充。在ACE中,這樣的靈活性是通過結合以下要素來獲得的:(1)C++語言特性,比如模闆、繼承和動态綁定,(2)設計模式,比如抽象工廠、政策和服務配置器,以及(3)OS機制.

除了OS适配層、C++包裝外觀和架構元件,ACE還提供了包裝成自包含元件的标準分布式服務庫。盡管這些服務元件并不是ACE架構庫的嚴格組成部分,它們在ACE中扮演了兩種角色:

1. 分解出可重用分布式應用的“積木”:這些服務元件提供通用的分布式應用任務的可重用實作,比如名字服務、事件路由、日志、時間同步和網絡鎖定。

2. 示範常用的ACE元件的用例:這些分布式服務還示範了怎樣用像Reactor、Service Configurator、Acceptor和Connector、Active Object,以及IPC包裝這樣的ACE元件來有效地開發靈活、高效和可靠的通信軟體。

Ice是一種面向對象的中間件平台。從根本上說,這意味着Ice為建構面向對象的客戶-伺服器應用提供了工具、API 和庫支援。Ice應适合在異種環境中使用:客戶和伺服器可以用不同的程式設計語言編寫,可以運作在不同的作業系統和機器架構上,并且可以使用多種網絡技術進行通信。無論部署環境如何,這些應用的源碼都是可移植的。

ICE的好處包括:

(1)客戶無需詢問外部的查找服務,比如命名服務,就能夠建立代理。實際上,對象辨別和對象的名字被認為是同一事物。這樣能夠消除命名服務的内容與實際情況失去同步所可能帶來的問題;同時,為了讓客戶和伺服器正常工作、必須正常運轉的系統元件的數目也會減少。

(2)通過建立所需的初始對象的代理,客戶可以輕松地進行自引導(bootstrap)。這樣就無需使用單獨的引導服務了。

(3) 不需要對串化代理進行不同的編碼。一種統一的表示就足夠了,而這種表示是人可以閱讀的。這樣就避免了CORBA 的三種不同的對象引用編碼(IOR、corbaloc,以及corbaname)所帶來的各種複雜問題。開發者多年使用CORBA 的經驗表明,對象引用的不透明性很成問題:它不僅需要更加複雜的API 和運作時支,還會妨礙我們建構現實的系統。為此, CORBA 增加了像corbaloc 和corbaname 這樣的機制,以及用于進行引用比較的is_equivalent 和hash 操作(這些操作的定義有問題)。所有這些機制都降低了對象引用的不透明性,但CORBA 平台的其他部分仍試圖維持引用是不透明的這樣一個錯覺。結果,開發者在兩方面所得的東西都是最糟的:引用既不是完全不透明的,也不是完全透明的——這樣所帶來的混亂和複雜性相當大。對象辨別Ice 對象模型假定對象辨別在任何地方都是唯一的(但并沒有把這個要求強加給應用開發者)。這種對象辨別的主要好處是,你可以遷移伺服器,也可以把多個不同伺服器中的對象合并進 一個伺服器,而不用考慮名字沖突的問題:如果每個Ice 對象都具有唯一的辨別,它就不可能與另外的域中的對象的辨別發生沖突。Ice 對象模型還使用了強對象辨別:使用本地的用戶端操作,你就能确定兩個代理表示的是否是同一個對象(在CORBA 中,要進行可靠的辨別比較,你必須調用遠地對象上的操作)。本地辨別比較要高效得多,而且對于有些應用領域而言(比如分布式事務服務),這樣的比較也至關緊要。

Ice 在架構上提供的好處

(1)面向對象的語義:Ice “線上路上”完全保留了 面向對象範型。所有的操作調用都使用遲後綁定,是以操作的實作的標明,是根據對象在運作時的(而不是靜态的)實際類型決定的。

(2)持同步和異步的消息傳遞:Ice 提供了同步和異步的操作調用和分派,并且通過IceStorm 提供了釋出-訂閱消息傳遞機制。這樣,你可以根據你的應用的需要來選擇通信模型,而不必把你的應用硬塞進某種模型裡。

(3)支援多個接口:通過facets,對象可以提供多個不相關的接口,同時又跨越這些接口、保持單一的對象辨別。這提供了極大的靈活性,特别是在這樣的情況下:應用在發生演化,但又需要與更老的、已經部署的客戶保持相容。

(4)機器無關性:客戶及伺服器與底層的機器架構屏蔽開來。對于應用代碼而言,像位元組序和填充這樣的問題都隐藏了起來。

      (5)語言無關性:客戶和伺服器可以分别部署,所用語言也可以不同(目前支援C++、Java,以及PHP (用戶端))。 客戶和伺服器所用的Slice 定義建立兩者之間的接口合約,這樣的定義也是它們唯一需要達成一緻的東西。

(6)作業系統無關性:Ice API 完全是可移植的,是以同樣的源碼能夠在Windows 和UNIX上編譯和運作。

(7)線程支援:Ice run time 完全是線程化的,其API 是線程安全的。 作為應用開發者,(除了在通路共享資料時進行同步)你無需為開發線程化的高性能客戶和伺服器付出額外努力。

(8) 傳輸機制無關性:Ice 目前采用了TCP/IP 和UDP 作為傳輸協定。客戶和伺服器代碼都不需要了解底層的傳輸機制(你可以通過一個配置參數選擇所需的傳輸機制)。

(9)位置和伺服器透明性:Ice run time 會負責定位對象,并管理底層的傳輸機制,比如打開和關閉連接配接。客戶與伺服器之間的互動顯得像是無連接配接的。如果在客戶調用操作時,伺服器沒有運作,你可以通過IcePack 讓它們随需啟動。伺服器可以遷移到不同的實體位址,而不會使客戶持有的代理失效,而客戶完全不知道對象實作是怎樣分布在多個伺服器程序上的。

(10) 安全性:通過SSL 強加密,可以使客戶和伺服器完全安全地進行通信,這樣,應用可以使用不安全的網絡安全地進行通信。你可以使用Glacier穿過防火牆,實作安全的請求轉發,并且完全支援回調。

(11)内建的持久機制:使用Freeze,建立持久的對象實作變成了一件微不足道的事情。Ice提供了對高性能資料庫Berkeley DB[18] 的内建支援。  Ice 的源碼是開放的。盡管要使用Ice 平台,并不一定要閱讀源碼,通過源碼你可以了解各種事情是怎樣實作的,或把這些代碼移植到新的作業系統上。

總而言之, Ice 和ACE 提供了一流的分布式計算開發和部署環境,比我們所知道的其他任何平台都更完整。提供适用于異種環境的面向對象中間件平台,提供一組完整的特性,支援廣泛的領域中的實際的分布式應用的開發,避免不必要的複雜性,使平台更易于學習和使用。提供一種在網絡帶寬、記憶體使用和CPU 開銷方面都很高效的實作,提供一種具有内建安全性的實作,使它适用于不安全的公共網絡。

繼續閱讀