??? 摘 要:MIDAS為開發(fā)多層分布式應用系統(tǒng)提供的一個中間透明引擎,能有效地利用DCOM、TCP/IP等技術在Internet/Intranet上建立結構為“ 瘦客戶端+應用程序服務器+數(shù)據庫系統(tǒng)”的多層分布式應用程序,在此結構下可利用對象代理實現(xiàn)分布式負載均衡與容錯,從而提高系統(tǒng)的性能。
??? 關鍵詞:MIDAS;應用服務器;負載平衡;容錯
?
??? Internet/Intranet 的興起使得企業(yè)很方便地使用MIS(企業(yè)管理系統(tǒng))來進行規(guī)劃管理。目前大多數(shù)MIS采用兩層C/S 結構,但隨著使用的深入,該結構逐漸暴露出其架構上的缺陷,如應用程序的可伸縮性和維護,同時,如何控制數(shù)據的統(tǒng)一性和完整性也成為問題。
??? 新一代的數(shù)據庫管理系統(tǒng)在傳統(tǒng)的C/S 結構中增加了應用服務器,這種新的結構就是所謂的三層體系結構。三層體系結構指邏輯上的三層,包括應用表示層、應用邏輯層和數(shù)據層。應用表示層又名客戶端, 主要負責用戶端界面, 提供給用戶一個操作方便且簡單快捷的應用服務接口;應用邏輯層或為應用服務器, 是整個結構中最重要的部分, 實現(xiàn)應用程序的應用邏輯處理;數(shù)據層又為數(shù)據庫服務器, 負責數(shù)據的存取和管理。應用服務器包括了統(tǒng)一的界面、業(yè)務規(guī)則的制定和數(shù)據處理邏輯的規(guī)定等功能。通常情況下, 客戶端不直接與數(shù)據庫進行交互, 而是通過通信協(xié)議與中間層建立連接, 再經由中間層與數(shù)據庫進行交互。多層應用服務技術允許分割應用程序,這樣,本地計算機無需安裝一整套數(shù)據庫工具,便可以在另一臺機器上存取數(shù)據;同時,它允許對業(yè)務規(guī)則和進程進行機種管理,并在整個網絡上分發(fā),實現(xiàn)進程負載的動態(tài)調節(jié)。
1 MIDAS技術
??? MIDAS 的全稱是Multi- tier Distributed Application Services Suite(多層分布式應用程序服務包)。Delphi中所有強大又奇妙的分布式多層能力都來自MIDAS 的功能。MIDAS 是Delphi 多層應用系統(tǒng)的技術核心,是Delphi 用來開發(fā)多層應用系統(tǒng)所使用的中介透明引擎。通過MIDAS,程序員可以使用相同的組件存取不同的后端應用程序服務器。此外MIDAS 也提供了容錯能力、負載平衡能力以及高執(zhí)行效率的能力。
??? 多層結構其實是對傳統(tǒng)C/S結構的擴展,是把一個數(shù)據庫應用程序分解成幾個邏輯部分,客戶端程序集中處理數(shù)據顯示部分和用戶與數(shù)據之間的交互。其優(yōu)點可歸納為:
??? (1)將數(shù)據處理及通信功能封裝在一個共享的中間層里。不同的客戶端程序都能訪問這個中間層,這樣就避免了為每個客戶程序復制數(shù)據處理部分而產生的冗余。
??? (2)縮小了客戶端程序的規(guī)模,使得客戶端程序更容易進行開發(fā)。這是因為不需要安裝、配置和維護數(shù)據庫連接軟件。
??? (3)采用分布式數(shù)據處理過程。將一個應用程序要處理的任務分在幾臺機器上進行處理,從而提高了程序執(zhí)行的性能。
??? (4)提高了數(shù)據的安全性。將不同的數(shù)據功能封裝成一定的中間層,通過提供安全控制結合容錯技術,可以開發(fā)出更安全的應用系統(tǒng)。
2 MIDAS技術架構和工作原理
??? MIDAS技術實現(xiàn)的架構圖如圖1所示
?
2.1客戶端
??? 從邏輯結構上看, 客戶端主要由三部分組成。首先,客戶端的DataModule中包含與應用服務器建立連接的RemoteServer組件, 客戶端通過RemoteServer組件與應用服務器的IAppserver接口連接,以此進一步連接DataSetProvider接口, 從而通過DataAccess組件實現(xiàn)數(shù)據的獲取和更新操作。再者ClientDataSet組件支持數(shù)據的存取、編輯、瀏覽、約束和過濾等功能。最后在客戶端Form中, 由數(shù)據感知組件如DBGrid、DBEdi、DBNavigator等形成與用戶交互的接口。
2.2應用服務器
??? 應用服務器是系統(tǒng)的核心, 也是連接客戶端和遠程數(shù)據庫的重要橋梁。該層主要由遠程數(shù)據模塊構成。
??? 遠程數(shù)據模塊RemoteDataModule是一個支持雙重接口的自動化服務器, 它自身提供了IAppServer接口。客戶端利用該接口與數(shù)據供應接口DataSetprovider通信。遠程數(shù)據模塊是一個容器, 可容納訪問遠程數(shù)據庫服務器的DataAccess對象和充當數(shù)據代理的DataSetProvider對象等。數(shù)據集組件DataAccess主要包括Table、Query、StoreProc等, 其主要功能是實現(xiàn)遠程數(shù)據庫的訪問, 該組件通過BDE、ADO、OLE DB等引擎接口訪問遠程數(shù)據庫。數(shù)據供應組件DataSetProvider充當DataSet對象與客戶端ClientDataSet對象間的數(shù)據代理。該組件有兩大功能:(1)通過DataSet對象從數(shù)據庫服務器獲取數(shù)據并封裝成數(shù)據包后回傳給客戶端的ClientDataSet對象;(2)將客戶端ClientDataSet對象中要求更新的數(shù)據提交給數(shù)據庫服務器, 并把由于各種原因而不能實現(xiàn)更新的數(shù)據存入日志后回傳給客戶端。MIDAS.DLL用于管理與組織應用服務器提供者組件和客戶端數(shù)據集組件上的數(shù)據包。
2.3數(shù)據庫服務器
??? 后臺遠程數(shù)據庫存放著用戶的所有業(yè)務數(shù)據, 通過BDE、OLE DB或ODBC等數(shù)據訪問接口和應用服務器進行通信。
??? 在一個基于MIDAS 的三層應用中,客戶端通過應用服務器得到數(shù)據和進行數(shù)據更新的過程,通常按照如下順序和方式實現(xiàn):
??? (1)用戶啟動客戶端應用??蛻舳诉B接到應用服務器,如果應用服務器尚未運行,它將被啟動。客戶端從應用服務器得到一個IAPPServer 接口。
??? (2)客戶端從應用服務器請求數(shù)據。
??? (3)應用服務器獲取數(shù)據,為客戶端打包數(shù)據,返回一個數(shù)據包給客戶端。
??? (4)客戶端解開數(shù)據包,顯示數(shù)據給用戶。
??? (5)當用戶與客戶端程序交互時,數(shù)據被更新。這些改動被客戶端記錄在一個變更日志中。
??? (6)最后,客戶端向應用服務器提請更新(applyupdates),通常是響應于用戶的一個操作。
??? (7)應用服務器解開數(shù)據包,并向數(shù)據庫服務器遞交更新(postupdates) 。
??? (8)當應用服務器完成解析過程,它返回任何沒有遞交的記錄給客戶端,以供后來的進一步解析。 ??????
??? (9)客戶端調整沒有解析的記錄。
??? (10)客戶端從服務器得到數(shù)據刷新自己。
3 MIDAS的實現(xiàn)
??? 要創(chuàng)建一個多層C/S應用程序,首先要創(chuàng)建應用服務器,然后注冊或安裝應用服務器, 只有應用服務器已注冊并且正在運行的情況下, 才能創(chuàng)建客戶程序。對于客戶程序來說, 既可以在設計期間連接應用服務器, 也可以在運行期間連接應用服務器。創(chuàng)建MIDAS應用服務器步驟如下:
??? (1)創(chuàng)建一個遠程數(shù)據模塊(Remote DataModule), 它允許客戶以DCOM、TCP等方式訪問此服務器;
??? (2)把一個數(shù)據集構件, 如TTable、TQuery或TStoredProc放到遠程數(shù)據模塊上,使它們能訪問遠程的后臺數(shù)據庫;
??? (3)把TDataSetProvider構件放在遠程數(shù)據模塊上, 設置它的DataSet屬性指定為要訪問的數(shù)據庫,其實就是第(2)步所放的數(shù)據集構件;
??? (4)編寫代碼, 實現(xiàn)規(guī)則;
??? (5)保存、編譯、注冊或者安裝應用服務器。
??? 在多層體系結構中, 一個客戶程序至少需要一個TClientDataSet構件, 作用是引入數(shù)據集。創(chuàng)建一個客戶程序的步驟如下:
??? (1)新建一個項目, 在項目中添加一個數(shù)據模塊(DataModule);
??? (2)根據通信協(xié)議把一個或者幾個MIDAS連接構件如TDCOMConnection加入到數(shù)據模塊上,設置相關屬性,指定和連接應用服務器, 這與具體的MIDAS連接構件有關;
??? (3)把一個或幾個TClientDataSet構件放到數(shù)據模塊上, 設置RemoteServer屬性指定為第(2)步添加的MIDAS連接構件, 設置Providername屬性為應用服務器上的TDataSetProvider構件, 這樣客戶程序就可以和應用服務器通信;
??? (4)把一個TDataSource構件放到數(shù)據模塊上, 設置它的DataSet屬性為第(3)步添加的TClientDataSet構件, 再把一個數(shù)據感知控件如TDBGrid放到窗體上, 設置它的DataSource屬性為TDataSource構件,至此, 一個簡單的客戶程序創(chuàng)建完畢。
4 可靠性分析
??? 在多層結構環(huán)境中,所開發(fā)的應用系統(tǒng)除了必須能夠正確而且有效率地運行之外,如何讓其更安全可靠,不會因為應用服務器或是數(shù)據庫服務器故障而導致整個系統(tǒng)無法繼續(xù)運行也是非常重要的。分布式多層應用系統(tǒng)的可靠性具體可以通過以下能力來體現(xiàn):
??? (1)負載平衡能力。指能夠根據應用程序服務器的不同負荷,動態(tài)分配客戶端的連接,不至于有的應用服務器負載過重,而有的應用程序服務器負載過輕,使得所有的應用程序服務器的負載達到一個平衡。
??? (2)容錯能力。指某臺應用服務器發(fā)生故障時,原先連接到該服務器的客戶端可以立刻連接到其他提供相同服務的應用服務器,并繼續(xù)取得服務。
??? (3)暫存數(shù)據能力。指當所有的應用服務器都發(fā)生了故障,或是數(shù)據庫服務器發(fā)生了故障,客戶端應用程序應該有一種機制能夠把用戶更新的數(shù)據暫存在客戶端機器中,等應用程序服務器或是數(shù)據庫服務器恢復正常后,客戶端應用程序可以把數(shù)據加載到系統(tǒng)中,再實際更新回數(shù)據庫服務器中。
??? Delphi在客戶端提供了TSimpleObjectBroker組件來實現(xiàn)基本的負載平衡能力和容錯能力,該組件實現(xiàn)了基于偽隨機數(shù)算法的簡單對象代理。在客戶端的Data Module中加入一個TSimpleObjectBroker組件,并將其LoadBalanced屬性設置為true,然后把Data Module中各個RemoteServer組件的ObjectBroker的屬性設置成該TSimpleObjectBroker組件,就能夠實現(xiàn)偽隨機意義下的負載均衡。Servers屬性存儲一張能夠執(zhí)行應用服務器列表,該表的第i個表項Items[i]由ComputerName、Port、Enabled、HasFailed(應用服務器所在的計算機名、端口號、當前是否可用標記、連接失敗標記)4個域構成,并提供其中的機器名稱給TDCOMConnection或是TSocketConnection作為連接的遠程機器的名稱。當TDCOMConnection或是TSocketConnection連接的機器發(fā)生故障時,TDCOMConnection或是TSocketConnection可以從TSimpleObjectBroker取得一個新的能夠執(zhí)行應用程序服務器的遠程機器名稱,然后再連接到這臺新機器以取得應用程序服務器的服務。為了實現(xiàn)暫存數(shù)據能力,TClientDataSet提供了SaveToFile和LoadFromFile兩個方法。當所有的應用程序服務器都發(fā)生了故障,或是數(shù)據庫服務器發(fā)生了故障時,調用SaveToFile方法把TClientDataSet中所有的數(shù)據包括在客戶端更新的數(shù)據保存到一個文件中,然后在應用程序服務器或是數(shù)據庫服務器恢復正常后再執(zhí)行客戶端應用程序,調用LoadFromFile方法加載先前存儲的數(shù)據到TClientDataSet中,最后再調用ApplyUpdates方法把客戶端更新的數(shù)據更新回數(shù)據庫中。
??? MIDAS技術與C/S 技術相比,尤其是在大中型數(shù)據庫應用系統(tǒng)中,系統(tǒng)的穩(wěn)定性、延展性和執(zhí)行效率有很大提高。開發(fā)一個高效可靠的分布式多層數(shù)據庫應用系統(tǒng),還必須考慮負載平衡、容錯控制等能力,使用MIDAS的ObjectBroker技術可以實現(xiàn)并有效地提升系統(tǒng)的效率和健壯性。
參考文獻
[1] 李維. Delphi 5.x 分布式多層應用系統(tǒng)篇[M]. 北京: 機械工業(yè)出版社,2000.
[2]?TEIXEIRA S,PACheco X. Delphi開發(fā)人員指南[M]. 北京:機械工業(yè)出版社,2003.
[3]?王志剛. 基于MIDAS分布式多層系統(tǒng)的容錯技術. 湖南師范大學自然科學學報, 2001, 24 (2): 15.
[4]?徐新華.Delhi高級編程——Database與MIDAS編程[M].北京:人民郵電出版社,2000.
[5]?于重重. 基于三層ClientServer結構的管理信息系統(tǒng)的實現(xiàn). 北京工商大學學報,2000,17(7):35-38.