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