收稿日期:2007-10-29;修回日期:2008-03-04
作者簡介:ANGERER Bernhard(1970-),男,奧地利公民,博士,主要研究方向為面向?qū)ο蟮木幊獭⒚嫦蚍盏木幊獭⒔M件體系結(jié)構(gòu)、虛擬共享內(nèi)存系統(tǒng)和語義環(huán)境計算系統(tǒng)(www.angerer.com).
(1.GigaSpaces Technologies Inc., New York 10017; 2.Rosensteel Beckmann LLC, New York 10016; 3.IBM Corporation, New York 10532; 4.清華大學 軟件學院, 北京 100084)
摘 要:全面地介紹了一種基于空間的中間層編程方法。這是一種以分布式虛擬共享內(nèi)存為技術(shù)基礎設施的新型編程方法。其重要性在于它將分布計算的語義環(huán)境和問題領域的語義環(huán)境在極大程度上相分離,從而可以為今天軟件體系結(jié)構(gòu)中存在的種種問題提供具有持續(xù)可靠性的解決方案。
關(guān)鍵詞:協(xié)調(diào)中間件;基于代理的體系結(jié)構(gòu);基于空間的體系結(jié)構(gòu);數(shù)據(jù)網(wǎng)格;Tuple 空間;Java 空間
中圖分類號:TP311.11
文獻標志碼:A
文章編號:1001-3695(2008)10-3022-04
Space-based programming
ANGERER Bernhard1, WANG Tong2, ZHOU Nian-jun3, LIU Ying-bo4
(1.GigaSpaces Technologies Inc., New York 10017, USA; 2. Rosensteel Beckmann LLC, New York 10016, USA; 3.IBM Corporation, New York 10532, USA; 4.School of Software, Tsinghua University, Beijing 100084, China)
Abstract:The intention of this paper gave a comprehensive overview about the space based approach to middleware. This model introduced a distributed, virtual shared memory infrastructure that came along with a new type of programming model. The significance is that it greatly decouples the semantics of distributed computing from the semantics of the problem domain and therefore provides sustainable answers to vivid problems in today’s software architectures.
Key words:coordination middleware; agent-based architecture; space-based architecture; data grids; Tuple spaces; Java spaces
基于空間的編程代表著分布式應用軟件的新型設計方法。當前占統(tǒng)治地位的分布式編程是以遠程過程調(diào)用(RPC)為基礎。這種方法突出地體現(xiàn)在 CORBA 技術(shù)平臺中,而且也是Web服務標準(Web-services standards)下的基本設計方法。空間體系結(jié)構(gòu)(space-based architecture)則用一種極其簡捷的模式完全取代了遠程過程調(diào)用。其固有的簡潔特性決定了它具有廣泛的適用性,并賦予其模塊性(modularity)、可擴展性 (scalability)和源代碼經(jīng)濟性(source code economy)的優(yōu)點。
20世紀80年代早期,為了支持分布式的應用軟件,耶魯大學的 Gelernter等人開發(fā)了一種名為Linda的編程語言[1,2],從而邁出了走向空間體系結(jié)構(gòu)的第一步。Linda由一套數(shù)量不多的操作(operations)與一個全局共享的持續(xù)存儲,即所謂的Tuple 空間(名為Tuple 空間的技術(shù)基礎設施-infrastructure誕生并存在于大學的實驗室中;90年代后期,Sun Microsystems采納了空間的概念,創(chuàng)造了JavaSpaces 即Java 空間)—相結(jié)合構(gòu)成。其協(xié)調(diào)規(guī)則與經(jīng)典的編程語言特性互補因而可以輕松地融合于其中。研究結(jié)果顯示,使用這種體系結(jié)構(gòu),并行和分布計算中的大量問題均可以得到很好的解決。
當今,基于空間的編程已進入代表現(xiàn)代網(wǎng)格計算(grid)系統(tǒng)的主流范疇,深深地影響著所有有價值的應用軟件(applications)的工程設計,尤其是在高同步分布式(distributed)高性能的系統(tǒng)環(huán)境中:如何將不同的元素(進程,processes、對象,objects、服務程序,services、代理程序,agents,人)放入到這樣的一個工作系統(tǒng)中并使其在開放的和動態(tài)的環(huán)境中完成富有成效的通信、集成與合作,仍是當前最重要和最具挑戰(zhàn)性的技術(shù)問題之一。
隨著基于空間的普通協(xié)調(diào)中間件(middleware)成功地產(chǎn)業(yè)化地運用于復雜應用軟件的工程設計[3~5],2003年發(fā)表的同名原文逐漸得到了越來越多的關(guān)注[6]。本文是2003年文章的更新版本,保留了原文的主要結(jié)構(gòu)但進一步豐富了一些細節(jié),并添加了一個例子來說明基于空間的體系結(jié)構(gòu)的運行和編程風格,同時補充了該技術(shù)應用方面的最新發(fā)展現(xiàn)狀。
1 分布式的共享內(nèi)存
所謂空間指的是一個虛擬的、分布式的、共享的內(nèi)存。實際上,這種內(nèi)存系統(tǒng)的思想本身已是長期研發(fā)的對象,并不是什么新東西。新的是對于基于空間的編程模式的技術(shù)基礎設施的全面理解。這與面向?qū)ο蟮木幊趟枷氲陌l(fā)展過程很相似,即編程的工具先出現(xiàn),但產(chǎn)生深遠影響的嚴謹理論則是在許多年以后才產(chǎn)生的(Jini 和 JavaSpaces 的區(qū)分與共通—視見解不同,為這種轉(zhuǎn)換增添了額外的障礙[7])。
空間的應用編程接口(API)本質(zhì)上包含四種方法,即寫入、讀出、提取和通知。寫入和讀出分別用來存儲和訪問對象;提取用來在讀出之后消除對象;通知用來宣布空間的變化。
這種設計思想使得分布式系統(tǒng)的模型大為簡化[8]。在一個遠程過程調(diào)用的模型中,對象通過顯式(explicit)的過程調(diào)用來相互通信并進行同步(synchronize)。如果沒有額外的輔助措施,這種方法的可擴展性不會很好;一般來講,參加的對象越多,它們之間的通信線路就越長越復雜[9]。然而,在一個空間的模型中,空間本身在參加者(participants)之間起到同步的作用。在這種典型的黑板通信模式中,參加者:無須彼此了解(它們之間的交流是非連接的和匿名的);無須共享同樣的進程或機器(跨進程的-interprocess);暫時不依賴于彼此(異步的)。這種在所有三個維度上的全面自由度(圖1)會導致非常好而靈活的系統(tǒng)設計效果。
從實現(xiàn)層面上講,空間由空間服務程序提供,這種服務程序一般具備下列基本功能:
a)透明數(shù)據(jù)共享性。空間全透明地滿足一個網(wǎng)絡(network)當中多進程的并發(fā)的數(shù)據(jù)共享操作。由于應用軟件的開發(fā)者無須知道相互之間交流的細節(jié),分布式的數(shù)據(jù)結(jié)構(gòu)(data structures)(比較[10, 11]) 很容易建立。實際上的數(shù)據(jù)交付機制(復制、傳播)發(fā)生在幕后并因執(zhí)行而異。
b)持續(xù)性。空間維護著一個存儲機制以確保對象的存在,直到某個進程明確地將它們消除,或由空間在租借期滿時將其消除。這樣一來,像聊天這樣的應用軟件在執(zhí)行過程中就不再需要同時調(diào)用其參與程序。
c)相關(guān)性(associativity)。對象在空間中采用聯(lián)想的方式定位。讀出操作通過描述數(shù)據(jù)域的內(nèi)容來尋找某一對象(也許采用空白的通配符)。空間的搜索引擎則通過將值和類型相匹配來返回需要的對象。
d)交易性 (transaction)。空間通過事務處理(transaction)模型來保證一個或多個空間中的一個或多個操作在執(zhí)行過程中的原子性(atomicity)。
e)代碼轉(zhuǎn)移性 (code transfer)。對象作為被動數(shù)據(jù)以序列化的形式存在于空間中。然而,一經(jīng)讀出,一個對象包含的數(shù)據(jù)就可以被修改,其方法(methods)也可以被調(diào)用。在Java中對象加載的任務由類加載程序完成。
空間服務程序的關(guān)鍵在于其所提供的基本范式(paradigm)的簡單性。它易于把握,無須復雜而曲折的學習過程;最低限度的應用層面編程可以極大地降低開發(fā)成本;此外,它通過將發(fā)送者(sender)與接收者(receiver)相分離,將連接它們的應用邏輯變得更簡單、更靈活、更穩(wěn)定。這些特點尤其有助于大型應用軟件的構(gòu)造、分析、測試和再利用。
2 主人—工人的模式
主人—工人模式(the master-worker pattern)[12]完美地示范了空間的方法在開發(fā)一個Web應用軟件中的運用。網(wǎng)絡服務器在收到客戶的請求(如向不同的檔案庫提出詢問)后,將其作為請求對象異步地放置到空間中(圖2)。相關(guān)的工作進程(worker processes)則并行反應處理請求,并將處理結(jié)果作為答復對象返回到空間中。網(wǎng)絡服務器在接收到答復通知后,再將答案按照用戶界面的要求重新包裝提供給客戶。
通過以空間作為通信媒體以及交流進程之間的完全分離,這一執(zhí)行過程可以線性地伸縮。如果并發(fā)請求激增,只要根據(jù)需要添加額外的網(wǎng)絡服務器和工人機器(廉價的標準硬件)就可以了。一個工人程序代表一個檔案適配器。如要增加一個檔案庫,只要重新編寫一個適配器就可以將其引入一個正在運作的系統(tǒng)中。這種熱拔插的能力不僅有助于系統(tǒng)維護而且有助于系統(tǒng)開發(fā)和調(diào)試。
3 分布式的高速緩存
空間的另一個固有的內(nèi)在特征是分布式的高速緩存(ca-ching)。工作進程可以事先將答復對象存放在空間里,只需維持著答案與請求之間的映射關(guān)系,當一個匹配的請求到達時即可將答復對象立刻返回。
眾所周知,從成本效益比的角度考慮,要在一個系統(tǒng)中實現(xiàn)最佳的負載(load)平衡通常不是件容易的事。對此,空間同樣提供了一條自然的捷徑[13]。工人程序非常清楚它們各自機器的負載,所以可以授權(quán)空間來負責對請求的再分配。只有在一個有足夠資源的工人程序存在的條件下,一個請求才會被空間接收。負載就這樣在工作進程和機器之間自行調(diào)整,而無須發(fā)布有關(guān)負載本身的信息。
概括起來,基于空間的編程方法具有以下優(yōu)點:更快的開發(fā)周期;通過添加廉價標準硬件實現(xiàn)的高度可擴展性;負載從網(wǎng)絡服務器轉(zhuǎn)移到同時運行的工作進程上;編程接口之間完全分離;分布式的高速緩存;異構(gòu)系統(tǒng)(heterogenous landscape)之間的簡單集成。
羅克希德馬丁公司(Lockheed Martin)的首席技術(shù)官Bill Rawlings 曾宣稱,他利用空間的編程方法得以將源代碼(相對于J2EE來說)減少三分之二[14]。不難想象這對于項目預算和時間表會帶來什么樣的影響。
基于空間編程的優(yōu)點從根本上要歸功于以下因素:
a)基于黑板的體系結(jié)構(gòu)。空間代表一種新型的信息總線(bus),與整個異構(gòu)系統(tǒng)之間只有一個界面。進程因此而同步觸發(fā)。
b)應用程序內(nèi)活的對象。由于考慮到可擴展性的需要,數(shù)據(jù)庫通常是惟一能夠永久存放狀態(tài)信息的地方(無狀態(tài)的編程)。有了空間以后,技術(shù)和業(yè)務對象均可在空間中存儲其狀態(tài),設計得以大大地簡化。阻抗失配(impedance mismat-ching)的問題失去其尖銳性。
c)最低限度的應用層面編程。空間接口的簡單性是其所有顯著特點的關(guān)鍵。它避免了復雜的接口描述語言(如CORBA IDL)—— 參加者只需遵循固定的接口編程范式,因為他們都居于同一地址的空間。
上述因素可以被總結(jié)為基于空間的編程模式。請注意,這些模式的實現(xiàn)離不開下列基于空間技術(shù)的基礎設施:
d)對等式(peer-to-peer)引擎。因為空間是一個由引擎的聯(lián)邦創(chuàng)造的分布式被共享的內(nèi)存,它沒有中心服務器(因而沒有單點失敗以及瓶頸問題)。
e)集群(clustering)和高速緩存模塊的融合。在傳統(tǒng)的n層的體系結(jié)構(gòu)中,操作系統(tǒng)、數(shù)據(jù)庫和中間件均各有自己的高可用性和一致性模型。而在一個基于空間的系統(tǒng)中,所有與高可用性、可擴展性和高速緩存相關(guān)的問題均由同一套技術(shù)基礎設施來解決。
f)通信和協(xié)調(diào)模塊的融合。在傳統(tǒng)的分布式系統(tǒng)中,進程同步、遠程過程調(diào)用和信號傳遞分別由不同的模塊來操作。而在一個基于空間的系統(tǒng)中,所有軟件之間的通信和協(xié)調(diào)均由同一個機制來處理,不管它們是在同一地址的空間中對話,還是以同步或異步的方式遠程通話。
4 舉例
為了說明一個基于空間的體系結(jié)構(gòu)是如何工作的,這里看一下貸款處理的例子。貸款處理涉及以下步驟:收集有關(guān)申請人的數(shù)據(jù);檢驗申請人數(shù)據(jù)(即核實就業(yè)情況和銀行/投資賬戶余額);信用打分;風險分析和定價;保險以及完成。用基于空間的方法來實現(xiàn)這一過程,不同的任務被清晰地分成彼此通信的工人程序或服務程序。大家也可以將此看做是一個單一登錄的問題。不同的服務程序需要聯(lián)絡各種各樣的應用軟件來完成任務,彼此分離,但仍需要一個共同區(qū)域來共享它們的請求和結(jié)果。然而,在現(xiàn)有的系統(tǒng)中,這樣的一個操作比看上去要復雜得多,因為每個層次都需要有自己的高可用性和一致性模型。
目前,這樣的一個應用軟件只能以面向服務的方式來設計和開發(fā)。其產(chǎn)物就是所謂的工作流程應用軟件。其中每個服務程序同時既要維持多個對話,又要發(fā)送和接收消息。另外,鑒于使用環(huán)境(服務編制-service orchestration)或網(wǎng)絡環(huán)境(局域網(wǎng)/廣域網(wǎng))有可能發(fā)生變化,服務程序的反應時間經(jīng)過一段時期也會發(fā)生變化。
當前開發(fā)的這種應用軟件大多數(shù)成效不高。僅拿一個方面來看,每當消息進來時,程序都必須從數(shù)據(jù)庫中調(diào)出狀態(tài)信息,采取相應的行動,然后再將其存儲回去。這需要大量的重復代碼。同時還必須將其寫成一個由一套消息處理器(hand-ler)組成的事件驅(qū)動型程序,很難尋找邏輯流程。
空間通過讓你對有待分布的事實近乎忽略不計,將這樣的應用軟件變得非常容易寫。通信和協(xié)調(diào)的部分被抽象化了,因為代碼是在分布于幕后的數(shù)據(jù)結(jié)構(gòu)上工作的。所謂的局部變量變成了空間入口。請求對象或條目被放入到空間中請求答復。通知對象也被放入到空間中以便在答案到達時被通知。在某個特定請求之前可能還有其他請求需要先處理。由于編程的復雜性被減少到幾乎只有一個單一內(nèi)存,對協(xié)調(diào)的需要也就不知不覺地自行化解了。
圖3是本文的貸款處理一例的開始部分。
一定數(shù)量的軟件組件以一種完全分離的方式相互通信。一個組件提供申請人數(shù)據(jù)。另一個組件在這些對象到達時得到通知并提供相應的檢驗數(shù)據(jù)。第三個組件在等候這些數(shù)據(jù)以繼續(xù)進程鏈。
以上體現(xiàn)了空間的最基本的應用編程接口。條目的對象被寫入空間。事件/數(shù)據(jù)流的特點主要通過超時(timeout)設定(等候條目到達的時間)和租期(lease)設定(自動驅(qū)逐條目的時間)來決定。有關(guān)使用 JavaSpaces 的應用接口編程來實現(xiàn)分布式的數(shù)據(jù)結(jié)構(gòu)的詳細描述參閱JavaSpaces Principles, Patterns, and Practice[11]。
雖然圖3描述的情形非常容易寫,但傳統(tǒng)上則視之為不可取,因為:每一個對話都要求有一個帶有某種同步機制的牽涉好幾個機器的線程(thread);沒有處理更多負載的可擴展性,需要另外想辦法;如果虛擬機(Java virtual machine, JVM或者common language runtime, CLR)關(guān)閉,所有有關(guān)正在進行的對話的信息都會丟失。
5 結(jié)束語
空間系統(tǒng)結(jié)構(gòu)的魅力在于它在保證簡捷性的同時提供強大的功能[8]。與開發(fā)分布式應用軟件的其他模式相比,它設計簡單,節(jié)約開發(fā)和調(diào)試成本,使系統(tǒng)更健壯,維護和集成更容易。空間的體系結(jié)構(gòu)通過將復雜性從執(zhí)行階段轉(zhuǎn)移到配置階段,成功地將分布計算的語義環(huán)境和問題領域的語義環(huán)境相分離。在此請注意,在以空間為基礎的系統(tǒng)結(jié)構(gòu)中,配置不僅與分布計算環(huán)境相關(guān),而且是解決性能和可擴展性問題的主要手段。空間的引擎之所以能夠在差別很大的條件下(如讀操作密集或是寫操作密集)運行良好,這種靈活性都是由管理員通過配置來實現(xiàn)的。
空間體系結(jié)構(gòu)的特征使其得以在虛擬程度大大提高的環(huán)境下實施和操作。這種環(huán)境將不僅抽象化地提供分布式、成批次、規(guī)模化、可用性等服務,而且將開啟一扇通向前所未有的快捷性和靈活性的大門,將設計和編程人員從當前只能靠漫長的時間和巨額投資才能解決的技術(shù)束縛之中解脫出來。有關(guān)空間評論如下:
“當Linda語言在邏輯上可以良好地適用于以下所有操作的時候,為什么還要用三個工具箱來分別處理并行應用(如消息傳遞)、單處理器(uniprocessor)(如帶鎖的共享內(nèi)存)和跨網(wǎng)絡(trans-network)通信(如遠程過程調(diào)用)呢?”— David Gelenter [1]
“我設計和編寫了SPECTRE來與當前電子商務(E-business)中流行的典型的“三層”體系結(jié)構(gòu)相比較。“三層”體系結(jié)構(gòu)需要12 000多行代碼,兩個半人工和六個月的時間才能寫完。而與其性能相同的SPECTRE只需不到90行代碼,我用三個星期就寫完了。如果“Java空間”需要一些“重磅炸彈”才能被接納和認可的話,這些數(shù)字應該是足夠的了。”— Bill Rawlings[14]
“警告: 變革即在眼前。如果您想知道在將來應當如何設計和編寫服務器應用軟件……那么您應當往下讀……注意:拒絕是沒有用的。”— Sing Li[7]
“迄今為止,站在最前沿的用戶們都是通過對各類最好的技術(shù)加以整合來累加起具有高性能和高擴展性的應用軟件平臺。但新一代博大精深的標準化的XTP平臺將從網(wǎng)格技術(shù)、事件驅(qū)動型的結(jié)構(gòu)體系、分布式的高速緩存和高性能通信的融合(convergence)之中誕生。”— Massimo Pezzini / Gartner[15]
“思維上的量子飛躍。”—Bill Joy[16]
目前已有一定數(shù)目的基于空間的系統(tǒng)投產(chǎn)使用。大多數(shù)這樣的系統(tǒng)所解決和處理的復雜程度遠遠超出傳統(tǒng)應用服務器所能處理的范圍,因為傳統(tǒng)服務器遵循以分層為基礎的模型[5],需要在應用層面、數(shù)據(jù)層面和通信層面上分別集群[17]。Gartner注意到這一新發(fā)展并開始賦予這類應用軟件一個新名詞,即XTP(extreme transaction processing)[18]。Gartner 給XTP下的定義是:網(wǎng)格技術(shù)、事件驅(qū)動型的結(jié)構(gòu)體系、分布式的高速緩存平臺和高性能通信的融合[15]。這同樣也是對于基于空間的系統(tǒng)的恰當定義。
參考文獻:
[1] GELERNTER D, CARRIERO N. Coordination languages and their significance [J]. Communications of the ACM, 1992,35(2):97-107.
[2]GELERNTER D. Mirror worlds: or the day software puts the universe in shoebox...how it will happen and what it will mean[M]. [S.I.]:Oxford University Press, 1992.
[3]GRIDtoday. GigaSpaces positioned in visionaries quadrant by gartner[EB/OL]. (2006-10-05). http://www.gridtoday.com/grid/959632.html.
[4]GRIDtoday. Grids gets transactional [EB/OL]. (2006-12-11). http://www.gridtoday.com/grid/1150800.html.
[5]Intel. Scaling the grid, case study [EB/OL].(2006). http://www-03.ibm.com/servers/deepcomputing/cod/pdf/fsscasestudy.pdf.
[6]ANGERER B. Space based programming [EB/OL]. (2003-03-19). http://www.onjava.com/pub/a/onjava/2003/03/19/java_spaces.html.
[7]LI S, HOULE P, WILCOX M, et al. Professional Java server programming: with servlets, Javaserver pages (JSP), XML, enterprise JavaBeans (EJB), JNDI, CORBA, Jini and JavaSpaces (平裝) [M]. [S.l.]: Wrox Press, 1999.
[8]VENNERS B. Designing as if programmers are people [EB/OL]. (2003-06-03). http://today.java.net/pub/a/today/2003/06/10/design.html.
[9]ANGERER B, ERLACHER A. Loosely coupled communication and coordination in next-generation Java middleware [EB/OL]. (2005-06-03). http://today.java.net/pub/a/today/2005/06/03/loose.html.
[10]HUPFER S. Make room for JavaSpaces-Part 1[EB/OL]. (2000-11-14). http://www-128. ibm. com/developerworks/java/library/j-space/.
[11]FREEMAN E, HUPFER S, ARNOLD K. JavaSpaces principles, patterns, and practice [M]. [S.l.]: Addison-Wesley, 1999.
[12]WHITE T. How to build a compute farm[EB/OL]. (2005-04-21). http://today.java.net/pub/a/today/2005/04/21/farm.html.
[13]LI S. High-impact Web tier clustering, part 2: building adaptive, scalable solutions with JavaSpaces [EB/OL]. (2003-09-30). http://www.ibm.com/developerworks/java/library/j-cluster2/.
[14]RAWLINGS B. Is JavaSpaces here to stay? [EB/OL]. (2000-08-17). http://archives.java.sun.com/cgi- bin/wa?A2=ind0008L=JAVASPACES-USERSP=R4517.
[15]GRIDtoday. GigaSpaces releases extreme application platform [EB/OL]. [2007-06-18]. http://www.gridtoday.com/grid/1611358.html.
[16]GUTH R. More than just another pretty name-Sun’s Jini opens up a new world of distributed computer systems [EB/OL]. (1998-08). http://sunsite.uakom.sk/sunworldonline/swol-08-1998/swol-08-jini.html.
[17]SHALOM N. Space-based architecture and the end of tier-based computing[EB/OL]. (2006). http://www.sun.com/thirdparty/srsc/resources/gigaspaces/GigaSpacesEndofTierBasedComputingwp.pdf.
[18]PEZZINI M. The challenges of extreme transaction processing in a world of services and events [EB/OL]. (2006-08-31). http://mediaproducts.gartner.com/reprints/oracle/131036.html.