引自:http://delia.org.ru/ArticleView/2005-9-7/Article_View_129438.Htm
一、 解釋一下智能客戶端技術(shù)
智能客戶端(Smart Client),結(jié)合了瘦客戶端(B/S模式)和胖客戶端(C/S模式)的長(zhǎng)處,是下一代的客戶端軟件技術(shù)。
要了解智能客戶端,首先要認(rèn)識(shí)瘦客戶端技術(shù)和胖客戶端技術(shù)各自的優(yōu)缺點(diǎn)。
對(duì)于前者,典型的應(yīng)用就是使用瀏覽器,通過(guò)輸入URL遠(yuǎn)程訪問(wèn)服務(wù)端,并向服務(wù)端發(fā)送命令,獲取服務(wù)端的資源,然后在客戶端的瀏覽器上顯示出來(lái)。由于這種技術(shù)數(shù)據(jù)庫(kù)存放在服務(wù)端,客戶端應(yīng)用界面的也是由服務(wù)端的文件生成,因此在客戶端上占用資源少,對(duì)客戶端的設(shè)備要求不高,只需一個(gè)瀏覽器軟件和可用的網(wǎng)絡(luò)便能開(kāi)始工作,另外,如果系統(tǒng)需要升級(jí)修改,只需要在服務(wù)端更新文件,當(dāng)客戶再次訪問(wèn)時(shí),就可以使用新的應(yīng)用系統(tǒng)了,因而部署和升級(jí)重點(diǎn)都放在了服務(wù)端,實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單。但是,這種B/S模式依賴網(wǎng)絡(luò),當(dāng)網(wǎng)絡(luò)不可用時(shí)或出現(xiàn)性能不穩(wěn)定的情況時(shí)就會(huì)導(dǎo)致客戶端變成“死界面”——既不能將數(shù)據(jù)發(fā)送回服務(wù)端進(jìn)行保存,又不能從服務(wù)端獲取數(shù)據(jù)拿到客戶端操作,一切的工作將要在網(wǎng)絡(luò)恢復(fù)后才能得以繼續(xù)。
對(duì)于胖客戶端技術(shù),用戶在使用這種軟件時(shí)獲得的最大的感官體驗(yàn)就是——它首先有自己獨(dú)特的應(yīng)用程序界面,而非通過(guò)瀏覽器,用戶甚至還可以根據(jù)自己的喜好調(diào)整軟件的布局,進(jìn)行豐富的界面元素的設(shè)置,這些都是B/S模式的瘦客戶端技術(shù)所不能媲美的。另外,用戶還能獲得較快的反應(yīng)速度,程序可以充分利用本地機(jī)器的資源,在不使用網(wǎng)絡(luò)訪問(wèn)遠(yuǎn)程資源時(shí),本地資源的訪問(wèn)在正常情況下都能得到很快的處理。同樣的,胖客戶端技術(shù)也有著不盡人意的地方——在客戶端進(jìn)行部署時(shí),由于客戶端可能出現(xiàn)各種各樣的情況,所以需要進(jìn)行必要的設(shè)置,部署起來(lái)比較困難,如果對(duì)軟件的版本進(jìn)行升級(jí),使用傳統(tǒng)的DLL技術(shù)的那將更是一個(gè)大的挑戰(zhàn),因?yàn)樵?/SPAN>.NET之前,標(biāo)準(zhǔn)Windows DLL或COM組件可能出現(xiàn)“DLL Hell”——注冊(cè)和更新軟件中的DLL時(shí),發(fā)現(xiàn)共享的DLL被最新版本改寫(xiě)了,并使該機(jī)器上的其他軟件也因此不能運(yùn)行。胖客戶端有可能需要在客戶端實(shí)現(xiàn)數(shù)據(jù)庫(kù)支持,數(shù)據(jù)庫(kù)放在本地有可能導(dǎo)致一些安全問(wèn)題,因?yàn)橄鄬?duì)于更重視安全的服務(wù)端,客戶端相對(duì)而言還是比較脆弱的。
那么智能客戶端技術(shù)便出現(xiàn)了,除了包括了胖/瘦客戶端各自的優(yōu)點(diǎn)外,它還具有如下四個(gè)最大的優(yōu)點(diǎn)——
1) 充分利用終端設(shè)備的優(yōu)勢(shì) (full PC, PDA, phone都可以滿足),因?yàn)楹诵牟糠衷诜?wù)端(可能Web Service),所以終端只需實(shí)現(xiàn)表示層和一些簡(jiǎn)單邏輯;
2) 能夠調(diào)用 web services,在server端用web服務(wù)實(shí)現(xiàn)業(yè)務(wù)邏輯,處理各種請(qǐng)求,需要說(shuō)明的是,由于業(yè)務(wù)邏輯實(shí)現(xiàn)放在客戶端,因此一方面為客戶端瘦身,另一方面也加強(qiáng)了軟件的隱蔽性和安全性;
3) 支持在線和離線兩種狀態(tài),用戶可以在網(wǎng)絡(luò)不可用時(shí)繼續(xù)工作,并將數(shù)據(jù)臨時(shí)存放在本地,當(dāng)網(wǎng)絡(luò)再次可用,數(shù)據(jù)便可傳上服務(wù)器;
4) 能夠如同Web應(yīng)用程序一般簡(jiǎn)單方便的部署,.NET使用程序集技術(shù),同一軟件的不同版本可以共存于統(tǒng)一客戶端。版本的升級(jí)也非常簡(jiǎn)單,軟件訪問(wèn)服務(wù)端,能自動(dòng)檢測(cè)版本號(hào),從而更新關(guān)鍵組件,實(shí)現(xiàn)升級(jí)。
二、 這種技術(shù)用途是什么?前景如何?
其實(shí)Smart Client的觀點(diǎn)在一些傳統(tǒng)的軟件技術(shù)中也可以看到一些影子,隨后.NET的出現(xiàn),才使這種技術(shù)的各個(gè)環(huán)節(jié)(客戶端顯示,數(shù)據(jù)連接,在線離線的操作和部署)得以無(wú)縫的實(shí)現(xiàn)。所以,這種技術(shù)是一種新型的客戶端技術(shù)的解決方案,是一種技術(shù)方法,它可以在各種終端上去實(shí)現(xiàn)。
將桌面級(jí)的軟件做成智能客戶端軟件,可以增強(qiáng)其功能,因?yàn)榫W(wǎng)絡(luò)無(wú)限,跳出桌面,就能獲得更多的信息。
基于Internet或intranet及瀏覽器的B/S模式的系統(tǒng),將其實(shí)現(xiàn)成智能客戶端軟件,可以擴(kuò)大其工作范圍,不用再依賴網(wǎng)絡(luò),還能充分利用本地資源,加快工作效率。易于部署的優(yōu)勢(shì)在企業(yè)級(jí)應(yīng)用中,更有發(fā)揮的余地,開(kāi)發(fā)人員只需簡(jiǎn)單的在服務(wù)端發(fā)布和部署,就能使客戶端同步更新。
舉些可以使用這種技術(shù)的應(yīng)用——
“產(chǎn)品售后服務(wù)系統(tǒng)”:產(chǎn)品售后服務(wù)人員允許以脫機(jī)的形式在本地創(chuàng)建送修工單、裝箱單等,這樣可以加快本地的工作效率,當(dāng)網(wǎng)絡(luò)可用時(shí),再將這些數(shù)據(jù)傳上服務(wù)器。并可從服務(wù)器獲得需要的信息。如果本地軟件的版本低于服務(wù)端的最高版本,將提示用戶進(jìn)行在線無(wú)縫地升級(jí),大大減輕了開(kāi)發(fā)人員的部署指導(dǎo)工作。
隨著.NET技術(shù)的進(jìn)一步成熟,尤其是Web Service技術(shù)的更廣泛應(yīng)用,乃至微軟將來(lái)的系統(tǒng)全面支持.NET,我相信智能客戶端技術(shù)將會(huì)成為首選的解決方案,應(yīng)用到各種軟件技術(shù)中。
三、 怎么運(yùn)用這種技術(shù)(通過(guò)案例)
智能客戶端程序一般都具有偶爾性連接的特征,所以我著重講述偶爾連接的智能客戶端應(yīng)用程序。同時(shí),其與網(wǎng)路的通訊又有四種方法——Enterprise Services,.NET remoting,Message Queuing(消息隊(duì)列)和Web services。基于普遍的觀點(diǎn)——Web 服務(wù)是生成大多數(shù)智能客戶端應(yīng)用程序的最佳方法。故在針對(duì)面向服務(wù)的方法和面向數(shù)據(jù)為中心的方法的選擇中,我決定選擇前者,因此,我重點(diǎn)講述以Web Services作為首選通訊方式,面向服務(wù)的智能客戶端技術(shù)。
設(shè)計(jì)面向服務(wù)的智能客戶端技術(shù),關(guān)鍵要解決如下幾個(gè)問(wèn)題,為使講述清晰,我將以一個(gè)案例作為例子。
我們要實(shí)現(xiàn)這樣一個(gè)購(gòu)書(shū)軟件(姑且命名為BuyBook),服務(wù)端有數(shù)據(jù)庫(kù),包含兩張數(shù)據(jù)表。一張表簡(jiǎn)單的描述了書(shū)籍的價(jià)格,這些價(jià)格是變動(dòng)的,管理員可以通過(guò)工具對(duì)里面的數(shù)據(jù)進(jìn)行改動(dòng);另外一張表則是書(shū)籍的訂單,記錄著訂購(gòu)者ID,訂購(gòu)書(shū)的ID和訂購(gòu)數(shù)量。兩表只有書(shū)的ID作為主外鍵關(guān)聯(lián)著。服務(wù)端還創(chuàng)建了必要功能的web服務(wù),以供客戶端調(diào)用。
下面繼續(xù)接著講面向服務(wù)的Smart Client技術(shù)關(guān)鍵解決的幾個(gè)問(wèn)題。
1) 連接的管理
智能客戶端軟件當(dāng)然不能過(guò)于頻繁地訪問(wèn)網(wǎng)絡(luò)上的服務(wù)端,因?yàn)檫@樣會(huì)嚴(yán)重影響軟件的性能,另外,對(duì)于連接發(fā)生的更改(包含如手動(dòng)連接、自動(dòng)連接、連接意外中斷和連接長(zhǎng)期不用等情況)軟件也要作出相應(yīng)的反應(yīng),以體現(xiàn)其智能的特點(diǎn)。
那么關(guān)于連接的管理有些什么適合的方案呢,我將以我舉的范例為例,設(shè)計(jì)其在這方面的處理方法。
BuyBook應(yīng)該盡量避免和網(wǎng)絡(luò)上的服務(wù)端進(jìn)行交互,即使網(wǎng)絡(luò)連接可用。可以優(yōu)先假設(shè)為離線操作,在機(jī)器本地進(jìn)行事務(wù)處理,當(dāng)然這樣會(huì)造成一定的問(wèn)題,有可能系統(tǒng)數(shù)據(jù)沒(méi)有和服務(wù)端數(shù)據(jù)同步,導(dǎo)致本地操作無(wú)效。如服務(wù)端書(shū)本的價(jià)格作為系統(tǒng)參數(shù)保留在本地,當(dāng)系統(tǒng)的數(shù)據(jù)變化時(shí),用戶在客戶端看到的書(shū)本的價(jià)格就不是真實(shí)的行情了。所以雖然優(yōu)先離線操作,也要考慮到數(shù)據(jù)出現(xiàn)不一致的情況,在數(shù)據(jù)沖突處理會(huì)得到詳細(xì)解答。
在一些特殊的例子中,如購(gòu)買股票的情況,由于股票的行情是不斷變化的,所以,為使本地?cái)?shù)據(jù)能體現(xiàn)真實(shí)的情況,網(wǎng)絡(luò)連接應(yīng)該采用隔時(shí)便來(lái)一次與服務(wù)端交互的動(dòng)作,這個(gè)“隔時(shí)”的時(shí)間長(zhǎng)度,可以用戶自定義,也可以是系統(tǒng)默認(rèn)。
我們還可以提供給用戶這么一個(gè)功能,他只需點(diǎn)一個(gè)按鈕,發(fā)送出一個(gè)訪問(wèn)服務(wù)端的命令,這時(shí)連接建立,并保持這個(gè)連接,直到手動(dòng)斷開(kāi),或網(wǎng)絡(luò)不可用。我們稱之為“手動(dòng)連接”,與之相對(duì)應(yīng)的是“自動(dòng)連接”,當(dāng)連接可用時(shí),保持連接狀態(tài),將緩存中的數(shù)據(jù)處理,發(fā)送到服務(wù)端,并獲取服務(wù)端最新的一些共用系統(tǒng)參數(shù)。
總而言之,對(duì)于連接,在設(shè)計(jì)系統(tǒng)時(shí)要把它看作是奢侈品,優(yōu)雅的對(duì)待網(wǎng)絡(luò),無(wú)論網(wǎng)絡(luò)處于什么狀態(tài),用戶的數(shù)據(jù)操作都可以放在本地緩存。
2) WEB服務(wù)的交互
面向服務(wù)的智能客戶端應(yīng)用程序,通過(guò)網(wǎng)絡(luò)與服務(wù)端的交互工作重點(diǎn)就在于web service上。按照前面所言,應(yīng)該減少這種服務(wù)端上的遠(yuǎn)程交互,可以將本地操作緩存,并且在與web服務(wù)交互過(guò)程中,不必等待返回信息,在這延遲中可以進(jìn)行其他的操作。那么要實(shí)現(xiàn)這種延遲不影響工作的功能,最有效的辦法就是使用異步通訊的方式,可以考慮使用多線程。
WEB服務(wù)使用XML技術(shù),CRUD(Creat Read Update Delete)類型的數(shù)據(jù)庫(kù)操作,可以都通過(guò)Web Service。那么,就要講究Web Service里交互方法的定義了。當(dāng)客戶進(jìn)行一個(gè)Create操作時(shí),可能關(guān)聯(lián)到系統(tǒng)參數(shù),例如BuyBook應(yīng)用程序,當(dāng)客戶提交訂購(gòu)單時(shí),Web服務(wù)應(yīng)該先檢查本地的商品價(jià)格與服務(wù)端的價(jià)格是否一致,如果價(jià)格已經(jīng)不同,應(yīng)該提示客戶更新最新的價(jià)格,然后再作訂購(gòu)行為的判斷。Upate和Delete操作,很可能導(dǎo)致數(shù)據(jù)沖突。例如刪除動(dòng)作,應(yīng)該在客戶端上將相關(guān)記錄標(biāo)記為暫時(shí)刪除,然后在服務(wù)器上將刪除請(qǐng)求排隊(duì)。服務(wù)端進(jìn)行刪除時(shí)一定要檢測(cè)是否有數(shù)據(jù)沖突,如果出現(xiàn)沖突,還要進(jìn)行數(shù)據(jù)沖突的處理。
3) 本地?cái)?shù)據(jù)緩存
智能客戶端為了能及時(shí)地響應(yīng)用戶的操作,同時(shí)也是為了滿足脫機(jī)離線工作的需要,就必須將常用的固定的服務(wù)端數(shù)據(jù)緩存到本地。
如果連接是處于在線狀態(tài)的,本地?cái)?shù)據(jù)可以暫時(shí)保存在內(nèi)存中,ADO.NET里的DataSet本身就是可以用內(nèi)存臨時(shí)存儲(chǔ)的數(shù)據(jù)對(duì)象,數(shù)據(jù)在內(nèi)存中存儲(chǔ)只是一個(gè)臨時(shí)過(guò)渡,當(dāng)數(shù)據(jù)需要經(jīng)過(guò)操作后保存回遠(yuǎn)程數(shù)據(jù)庫(kù)時(shí),方法可以使用DataSet的數(shù)據(jù)適配器DataAdapter將變化的量返回?cái)?shù)據(jù)庫(kù)操作,這樣既加快了本地的反應(yīng)又節(jié)省了帶寬。
如果,應(yīng)用程序在斷線的狀態(tài)下工作,則將數(shù)據(jù)保存回本地的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),待再次連線時(shí),裝載進(jìn)DataSet,進(jìn)行處理。
4) 數(shù)據(jù)沖突處理
造成數(shù)據(jù)沖突最常見(jiàn)的原因包括用戶在執(zhí)行更新或刪除數(shù)據(jù)的操作時(shí),有可能該數(shù)據(jù)已經(jīng)被刪除掉了,這樣應(yīng)用程序找不到更新或刪除的項(xiàng),自然就會(huì)引發(fā)異常而出錯(cuò)。處理這樣的情況,可以采用一個(gè)簡(jiǎn)單的辦法,數(shù)據(jù)適配器DataAdapter能對(duì)DataSet變化進(jìn)行判斷——當(dāng)數(shù)據(jù)往數(shù)據(jù)庫(kù)返回時(shí),DataAdapter的Update方法可以檢查DataSet里每個(gè)DataRow的RowState,從而可以判斷該DataRow是最新的,還是已修改或已經(jīng)刪除的,然后執(zhí)行適合的數(shù)據(jù)庫(kù)操作,像找不到數(shù)據(jù)的那種情況,DataAdapter將得知數(shù)據(jù)庫(kù)受影響的行數(shù)不大于零,并產(chǎn)生異常,從而停止更新。然后,應(yīng)用程序就可以通過(guò)這個(gè)異常來(lái)處理數(shù)據(jù)沖突。
處理辦法是,如果服務(wù)端已經(jīng)不存在用戶需要?jiǎng)h除的原始數(shù)據(jù),那么,只要將客戶端的該條數(shù)據(jù)刪除。如果用戶是對(duì)該數(shù)據(jù)進(jìn)行更改,可以先檢測(cè)服務(wù)端的數(shù)據(jù),看是否存在,倘若不存在,則通知用戶,并視用戶的操作無(wú)效,同時(shí)將本地的那條過(guò)期數(shù)據(jù)刪除。
四、 總結(jié)
智能客戶端技術(shù)是頗有前途的下一代客戶端技術(shù),它能夠在有網(wǎng)絡(luò)連接和網(wǎng)絡(luò)斷開(kāi)的情況下靈活地工作。對(duì)用戶而言,這將是新的一種軟件使用體驗(yàn),能同時(shí)擁有C/S模式軟件快速的反應(yīng)、豐富的用戶界面體驗(yàn)和瘦客戶端模式那樣簡(jiǎn)單的部署,升級(jí)。對(duì)開(kāi)發(fā)者而言,開(kāi)發(fā)的難度變大了,考慮的方面多了,但還是有靈活的方案可供選擇,還可以結(jié)合.NET技術(shù),使用面向服務(wù)或面向數(shù)據(jù)的解決方案,在開(kāi)發(fā)中,要著重解決“連接的管理”,“WEB服務(wù)的交互”,“本地?cái)?shù)據(jù)緩存”和“數(shù)據(jù)沖突處理”的技術(shù)點(diǎn)。