国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
智能客戶端體系結(jié)構(gòu)與設(shè)計(jì)指南
發(fā)布日期: 8/20/2004 | 更新日期: 8/20/2004
智能客戶端體系結(jié)構(gòu)與設(shè)計(jì)指南
David Hill, Brenton Webster, Edward A. Jezierski, Srinath Vasireddy and Mohammad Al-Sabt, Microsoft Corporation; Blaine Wastell, Ascentium Corporation; Jonathan Rasmusson and Paul Gale, ThoughtWorks; and Paul Slater, Wadeware LLC
相關(guān)鏈接
Microsoft? patterns & practices 庫(kù)http://www.microsoft.com/resources/practices/default.mspx
Application Architecture for .NET: Designing Applications and Serviceshttp://msdn.microsoft.com/library/en-us/dnbda/html/distapp.asp
摘要:本章討論了您在設(shè)計(jì)和生成偶爾連接到網(wǎng)絡(luò)的智能客戶端應(yīng)用程序時(shí)可能面臨到的問題。本章討論了連接性的概念,介紹了兩種實(shí)現(xiàn)脫機(jī)功能的主要方法,并且討論了您在使應(yīng)用程序可供脫機(jī)使用時(shí)需要考慮的一些問題。
本頁(yè)內(nèi)容
常見的偶爾連接情況
偶爾連接設(shè)計(jì)策略
使用面向服務(wù)的方法設(shè)計(jì)偶爾連接的智能客戶端應(yīng)用程序
使用基于任務(wù)的方法
處理依賴性
小結(jié)
我們生活在一個(gè)連接程度越來(lái)越高的世界里。然而,在許多情況下,我們不能無(wú)時(shí)無(wú)刻都依賴連接。您的用戶可能需要旅行,他們可能會(huì)暫時(shí)失去無(wú)線連接,可能存在延遲或帶寬問題,或者您可能需要拆卸網(wǎng)絡(luò)的某些部分進(jìn)行維護(hù)。即使用戶的確具有良好的網(wǎng)絡(luò)連接,您的應(yīng)用程序也可能無(wú)法在所有時(shí)間都能訪問網(wǎng)絡(luò)資源。所請(qǐng)求的服務(wù)可能繁忙、停止運(yùn)行或者只是暫時(shí)不可用。
如果應(yīng)用程序有時(shí)無(wú)法及時(shí)地通過網(wǎng)絡(luò)與服務(wù)或數(shù)據(jù)交互,則為偶爾 連接的應(yīng)用程序。如果您能讓用戶在脫機(jī)時(shí)使用其應(yīng)用程序富有成效地工作,并且仍然能夠?yàn)槠涮峁┻B接的應(yīng)用程序在連接有效時(shí)所具有的好處,則可以提高用戶的生產(chǎn)率和工作效率,并且提高應(yīng)用程序的可用性。
智能客戶端相對(duì)于基于 Web 的應(yīng)用程序所具有的主要好處之一是:當(dāng)應(yīng)用程序無(wú)法連接到網(wǎng)絡(luò)資源時(shí),它們能夠讓用戶繼續(xù)工作。偶爾連接的智能客戶端能夠在未連接到網(wǎng)絡(luò)資源時(shí)工作,然后在以后某個(gè)時(shí)間在后臺(tái)更新網(wǎng)絡(luò)資源。更新可能幾乎立即發(fā)生,但有時(shí)可能發(fā)生在數(shù)天甚至數(shù)周以后。
要給予應(yīng)用程序完整的偶爾連接功能,您需要提供一種基礎(chǔ)結(jié)構(gòu),使用戶能夠在沒有連接到網(wǎng)絡(luò)資源時(shí)工作。該基礎(chǔ)結(jié)構(gòu)應(yīng)該包括數(shù)據(jù)緩存,以便可以在客戶端使用所有需要的數(shù)據(jù);它還應(yīng)該包括用戶工作詳細(xì)信息的存儲(chǔ),以便用來(lái)在用戶重新聯(lián)機(jī)時(shí)將客戶端與網(wǎng)絡(luò)資源同步。應(yīng)用程序?yàn)橹С峙紶栠B接的操作所需要的確切特性和功能取決于它的連接性、操作環(huán)境以及用戶在聯(lián)機(jī)和脫機(jī)時(shí)所期望的功能。但是,所有智能客戶端應(yīng)用程序都應(yīng)該在未連接到網(wǎng)絡(luò)時(shí)為用戶提供某種體驗(yàn),即使功能極其有限。在設(shè)計(jì)和生成應(yīng)用程序時(shí),應(yīng)該始終避免因?yàn)榉?wù)器不可用而在客戶端生成錯(cuò)誤消息。
本章考察您在生成具有脫機(jī)功能的應(yīng)用程序時(shí)所面臨的問題。它將討論設(shè)計(jì)脫機(jī)應(yīng)用程序的不同策略,詳細(xì)討論設(shè)計(jì)注意事項(xiàng),分析如何組織應(yīng)用程序以使用任務(wù),并且考察應(yīng)用程序應(yīng)該如何處理數(shù)據(jù)。
常見的偶爾連接情況
偶爾連接的智能客戶端在許多常見的情況下都極其有用。許多脫機(jī)情況涉及到用戶顯式斷開網(wǎng)絡(luò)連接并且在沒有網(wǎng)絡(luò)連接的情況下工作,例如:
?
保險(xiǎn)代理可能需要在離開辦公室的時(shí)候創(chuàng)建新的保險(xiǎn)單。他或她可能需要在無(wú)法連接到辦公室中系統(tǒng)的情況下,輸入所有相關(guān)數(shù)據(jù),計(jì)算保險(xiǎn)費(fèi),并簽發(fā)保險(xiǎn)單詳細(xì)信息。
?
銷售代表可能需要在現(xiàn)場(chǎng)(該銷售代表無(wú)法在此處連接到服務(wù)器)與客戶簽訂大訂單。他或她可能需要咨詢價(jià)格表和目錄信息,輸入所有訂單數(shù)據(jù),并提供交貨預(yù)算和折扣級(jí)別,而無(wú)須連接。
?
維護(hù)技術(shù)人員在客戶端站點(diǎn)處理服務(wù)呼叫時(shí)可能需要詳細(xì)的技術(shù)信息。應(yīng)用程序幫助他或她診斷問題,提供技術(shù)文檔資料和詳細(xì)信息,并且使該技術(shù)人員無(wú)須連接就能簽下部件訂單以及記錄他或她的操作。
其他脫機(jī)情況涉及到間歇性或低質(zhì)量的連接,例如:
?
遍布全球的客戶呼叫中心和企業(yè)網(wǎng)絡(luò)之間的連接可能不具有足夠高的質(zhì)量,以供全天候聯(lián)機(jī)使用。應(yīng)用程序應(yīng)該提供脫機(jī)功能(包括數(shù)據(jù)緩存),以便維持應(yīng)用程序的可用性。
?
攜帶 Tablet PC 旅行的醫(yī)務(wù)人員可能在旅行途中經(jīng)歷網(wǎng)絡(luò)連接中斷的情況。當(dāng)應(yīng)用程序連接時(shí),它應(yīng)該在后臺(tái)同步數(shù)據(jù),而不應(yīng)該等待顯式重新連接。
應(yīng)該將偶爾連接的智能客戶端設(shè)計(jì)為最大限度地利用可用連接,確保應(yīng)用程序和數(shù)據(jù)盡可能保持最新,并且不會(huì)對(duì)應(yīng)用程序的性能造成不利影響。
返回頁(yè)首
偶爾連接設(shè)計(jì)策略
在設(shè)計(jì)偶爾連接的智能客戶端應(yīng)用程序的體系結(jié)構(gòu)時(shí),有兩種概括性的方法:以數(shù)據(jù)為中心 和面向服務(wù)。
使用以數(shù)據(jù)為中心的策略的應(yīng)用程序具有一個(gè)在客戶端上本地安裝的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng) (RDBMS),并且使用該數(shù)據(jù)庫(kù)系統(tǒng)的內(nèi)置功能將本地?cái)?shù)據(jù)更改傳回服務(wù)器,處理同步過程,并檢測(cè)和解決任何數(shù)據(jù)沖突。
使用面向服務(wù)方法的應(yīng)用程序?qū)⑿畔⒋鎯?chǔ)在消息中,并且當(dāng)客戶端脫機(jī)時(shí)將這些消息排列到隊(duì)列中。在重新建立連接以后,排隊(duì)的消息將被發(fā)送到服務(wù)器進(jìn)行處理。
圖 4.1 顯示了以數(shù)據(jù)為中心的方法和面向服務(wù)的方法。
圖 4.1 偶爾連接應(yīng)用程序設(shè)計(jì)的面向服務(wù)的方法和以數(shù)據(jù)為中心的方法
本節(jié)將詳細(xì)分析這兩種方法并解釋何時(shí)應(yīng)該使用每種方法。
以數(shù)據(jù)為中心的方法
當(dāng)您使用以數(shù)據(jù)為中心的方法時(shí),通常情況下,服務(wù)器發(fā)布數(shù)據(jù),而客戶端創(chuàng)建它所需要的數(shù)據(jù)的預(yù)訂,以便它可以在脫機(jī)之前將相應(yīng)的數(shù)據(jù)復(fù)制到本地?cái)?shù)據(jù)存儲(chǔ)。當(dāng)客戶端脫機(jī)時(shí),它將通過對(duì)本地?cái)?shù)據(jù)存儲(chǔ)的調(diào)用來(lái)對(duì)本地?cái)?shù)據(jù)進(jìn)行更改。當(dāng)客戶端重新聯(lián)機(jī)后,數(shù)據(jù)存儲(chǔ)會(huì)將對(duì)客戶端上的數(shù)據(jù)所做的更改傳回服務(wù)器。對(duì)服務(wù)器上數(shù)據(jù)所做的更改也可能被傳回客戶端。在合并階段遇到的任何沖突都將按照業(yè)務(wù)分析師定義的自定義規(guī)則,由在服務(wù)器或客戶端上指定的沖突解決規(guī)則處理。
在客戶端和服務(wù)器之間合并更改的過程稱為合并復(fù)制。更改可能在客戶端和服務(wù)器以自治方式發(fā)生,因此不使用 ACID(原子、一致、獨(dú)立、持久)事務(wù)。相反,當(dāng)執(zhí)行合并時(shí),系統(tǒng)中的所有預(yù)訂者都將使用發(fā)布者擁有的數(shù)據(jù)值。
以數(shù)據(jù)為中心的方法主要優(yōu)點(diǎn)是所有更改跟蹤代碼都包含在關(guān)系數(shù)據(jù)庫(kù)中。通常,這包括數(shù)據(jù)庫(kù)的列級(jí)和行級(jí)的沖突檢測(cè)代碼、數(shù)據(jù)驗(yàn)證代碼以及約束。這意味著您無(wú)須編寫自己的更改跟蹤代碼或沖突檢測(cè)與解決代碼,盡管您的確需要知道合并-復(fù)制方案以便針對(duì)數(shù)據(jù)沖突和數(shù)據(jù)更新來(lái)優(yōu)化您的應(yīng)用程序。
在以數(shù)據(jù)為中心的模型中,數(shù)據(jù)庫(kù)系統(tǒng)負(fù)責(zé)處理同步;因此,您無(wú)須自己來(lái)實(shí)現(xiàn)所有數(shù)據(jù)同步功能。用戶定義哪些表要求數(shù)據(jù)同步,而數(shù)據(jù)庫(kù)系統(tǒng)使基礎(chǔ)結(jié)構(gòu)可以跟蹤更改并且檢測(cè)和解決沖突。您可以通過使用 COM 對(duì)象或 Transact SQL (TSQL) 存儲(chǔ)過程的自定義沖突解決程序來(lái)擴(kuò)展該基礎(chǔ)結(jié)構(gòu),以便提供自定義沖突解決或避免機(jī)制。而且,因?yàn)樵谡麄€(gè)系統(tǒng)中只有一個(gè)數(shù)據(jù)儲(chǔ)存庫(kù),所以當(dāng)同步完成時(shí),能夠保證在服務(wù)器和客戶端之間執(zhí)行數(shù)據(jù)會(huì)聚。
但是,以數(shù)據(jù)為中心的方法有一些缺點(diǎn)。在客戶端上需要本地?cái)?shù)據(jù)庫(kù)意味著該方法在下列情況下可能不適合:
?
應(yīng)用程序在小型設(shè)備上運(yùn)行
?
需要輕觸部署機(jī)制。
?
非管理員用戶應(yīng)該能夠部署應(yīng)用程序
Microsoft 提供了能夠在 Windows? 客戶端、Windows Server? 和 Pocket PC 平臺(tái)上運(yùn)行的數(shù)據(jù)庫(kù)軟件,但它沒有為 SmartPhone 設(shè)備提供數(shù)據(jù)庫(kù)軟件。
而且,服務(wù)器上的數(shù)據(jù)庫(kù)與客戶端上的數(shù)據(jù)庫(kù)之間的緊耦合性意味著對(duì)服務(wù)器上數(shù)據(jù)庫(kù)架構(gòu)進(jìn)行的更改對(duì)客戶端具有直接影響。這可能使管理對(duì)客戶端或服務(wù)器進(jìn)行的數(shù)據(jù)庫(kù)架構(gòu)更改變得很困難。
對(duì)于大量客戶端而言,需要提供一種可管理且可伸縮的方法來(lái)部署獨(dú)特的數(shù)據(jù)集。合并復(fù)制支持動(dòng)態(tài)篩選,這使得管理員能夠定義這些脫機(jī)數(shù)據(jù)集并且以可伸縮的方式部署它們。您應(yīng)該利用數(shù)據(jù)庫(kù)提供的篩選機(jī)制來(lái)減少在客戶端和服務(wù)器之間發(fā)送的數(shù)據(jù)量,并降低沖突的可能性。
使用本地?cái)?shù)據(jù)庫(kù)在本地存儲(chǔ)和操作數(shù)據(jù)有許多好處。您可以使用數(shù)據(jù)庫(kù)將本地更改傳回服務(wù)器并幫助處理同步問題。
您應(yīng)該在下列情況下使用以數(shù)據(jù)為中心的方法:
?
您可以在客戶端部署數(shù)據(jù)庫(kù)實(shí)例。
?
您的應(yīng)用程序可以在兩層環(huán)境中工作。
?
您可以通過數(shù)據(jù)架構(gòu)定義和通訊協(xié)議將客戶端緊耦合到服務(wù)器。
?
您需要內(nèi)置的更改跟蹤和同步。
?
您希望依賴數(shù)據(jù)庫(kù)來(lái)處理數(shù)據(jù)協(xié)調(diào)沖突以及盡可能減少需要編寫的自定義協(xié)調(diào)代碼的數(shù)量。
?
您無(wú)須與多個(gè)截然不同的服務(wù)交互。
?
Windows 用戶能夠通過局域網(wǎng) (LAN) 或虛擬專用網(wǎng)絡(luò) (VPN/IPSec) 直接連接到數(shù)據(jù)庫(kù)。為 Pocket PC 平臺(tái)編寫的應(yīng)用程序能夠通過 HTTPS 同步 HTTP。
注 本指南沒有深入討論以數(shù)據(jù)為中心的方法。許多地方對(duì)它進(jìn)行了更為完整的介紹,包括 Microsoft SQL Server 聯(lián)機(jī)圖書或 MSDN。有關(guān)以數(shù)據(jù)為中心的方法的詳細(xì)信息,請(qǐng)參閱“Merge Replication”,網(wǎng)址為:http://msdn.microsoft.com/library/en-us/replsql/repltypes_6my6.asp。
面向服務(wù)的方法
對(duì)于面向服務(wù)的方法而言,客戶端可以與需要的任何服務(wù)交互。而且,客戶端將致力于服務(wù)請(qǐng)求本身,而不是對(duì)本地保存的數(shù)據(jù)進(jìn)行直接更改。服務(wù)請(qǐng)求可能在客戶端或服務(wù)器上導(dǎo)致狀態(tài)更改,但此類更改是服務(wù)請(qǐng)求的副產(chǎn)品。
面向服務(wù)策略的一個(gè)優(yōu)點(diǎn)是在客戶端上不需要本地關(guān)系數(shù)據(jù)庫(kù)。這意味著可以將該方法應(yīng)用于許多不同的客戶端類型,包括那些具有少量處理能力的客戶端,如移動(dòng)電話。
當(dāng)您的應(yīng)用程序必須在 Internet 和 Extranet 環(huán)境中工作時(shí),面向服務(wù)的方法尤其適合。如果您的客戶端在防火墻外部工作并且與企業(yè)服務(wù)交互,則通過使用面向服務(wù)的策略,您可以避免由于某種原因而必須在防火墻中打開特定的端口,例如為了啟用直接數(shù)據(jù)庫(kù)或 Microsoft 消息隊(duì)列 (MSMQ) 訪問。
松耦合意味著您可以在客戶端上使用與服務(wù)器上不同的數(shù)據(jù)架構(gòu),并且在客戶端傳輸數(shù)據(jù)。實(shí)際上,客戶端和服務(wù)器不需要知道對(duì)方。您還可以獨(dú)立地更新客戶端和服務(wù)器組件。
該方法的主要缺點(diǎn)是您需要編寫更多的基礎(chǔ)結(jié)構(gòu)代碼,以便存儲(chǔ)和轉(zhuǎn)發(fā)消息以及檢測(cè)應(yīng)用程序何時(shí)聯(lián)機(jī)或脫機(jī)。這可以使您在設(shè)計(jì)中具有更多的靈活性,但通常意味著在創(chuàng)建脫機(jī)客戶端時(shí)需要完成更多的工作。
注 智能客戶端脫機(jī)應(yīng)用程序塊 (Smart Client Offline Application Block) 為您提供了支持脫機(jī)客戶端的面向服務(wù)策略的代碼。您可以使用該塊來(lái)檢測(cè)應(yīng)用程序何時(shí)聯(lián)機(jī)或脫機(jī),并且存儲(chǔ)消息以及將消息轉(zhuǎn)發(fā)給服務(wù)器進(jìn)行處理。有關(guān)該應(yīng)用程序塊的概述,請(qǐng)參閱 Smart Client Offline Application Block,網(wǎng)址為:http://msdn.microsoft.com/library/en-us/dnpag/html/offline.asp。
面向服務(wù)的方法最適合于需要與許多不同服務(wù)交互的智能客戶端。因?yàn)橄⒌挠行ж?fù)載被封裝,所以傳輸層可以改變,而不會(huì)影響消息的內(nèi)容。例如,原來(lái)要發(fā)往某個(gè) Web 服務(wù)的消息可以同樣容易地發(fā)往消耗消息隊(duì)列消息的服務(wù)。消息與傳輸無(wú)關(guān)這一事實(shí)還使應(yīng)用程序可以根據(jù)需要自定義安全性實(shí)現(xiàn)。
您應(yīng)該在下列情況下使用面向服務(wù)的方法:
?
您希望消除客戶端和服務(wù)器之間的耦合,以便進(jìn)行獨(dú)立的版本控制和部署。
?
您需要對(duì)數(shù)據(jù)協(xié)調(diào)問題擁有更多的控制和靈活性。
?
您具有編寫更高級(jí)應(yīng)用程序基礎(chǔ)結(jié)構(gòu)代碼的開發(fā)人員技能。
?
您要求輕量客戶端足跡。
?
您能夠?qū)?yīng)用程序組織為面向服務(wù)的體系結(jié)構(gòu)。
?
您要求特定的業(yè)務(wù)功能(例如,自定義業(yè)務(wù)規(guī)則和處理、靈活的協(xié)調(diào)等等)。
?
您需要對(duì)客戶端上所存儲(chǔ)數(shù)據(jù)的架構(gòu)進(jìn)行控制,并且還要控制可能與服務(wù)器不同的靈活性。
?
您的應(yīng)用程序與多個(gè)服務(wù)或截然不同的服務(wù)(例如,多個(gè) Web 服務(wù),或者通過消息隊(duì)列、Web 服務(wù)或 RPC 機(jī)制提供的服務(wù))交互。
?
您需要自定義安全方案。
?
您的應(yīng)用程序在 Internet 或 Extranet 環(huán)境中工作。
盡管以數(shù)據(jù)為中心的方法和面向服務(wù)的方法都是有效的體系結(jié)構(gòu)方法,但許多智能客戶端應(yīng)用程序無(wú)法在客戶端上支持完整的關(guān)系數(shù)據(jù)庫(kù)實(shí)例。在這種情況下,您應(yīng)該采用面向服務(wù)的方法,并且確保您擁有適當(dāng)?shù)幕A(chǔ)結(jié)構(gòu),以便處理諸如數(shù)據(jù)緩存以及沖突檢測(cè)和解決等問題。
因此,本章的其余部分將集中討論智能客戶端開發(fā)人員在實(shí)現(xiàn)面向服務(wù)的方法時(shí)需要考慮的問題。
返回頁(yè)首
使用面向服務(wù)的方法設(shè)計(jì)偶爾連接的智能客戶端應(yīng)用程序
當(dāng)您使用面向服務(wù)的方法設(shè)計(jì)偶爾連接的智能客戶端時(shí),需要解決許多問題。這些問題包括:
?
優(yōu)選異步通訊。
?
盡可能減少?gòu)?fù)雜的網(wǎng)絡(luò)交互。
?
添加數(shù)據(jù)緩存功能。
?
管理連接。
?
設(shè)計(jì)存儲(chǔ)轉(zhuǎn)發(fā)機(jī)制。
?
管理數(shù)據(jù)和業(yè)務(wù)規(guī)則沖突。
?
與類似于 Create, Read, Update, Delete (CRUD) 的 Web 服務(wù)交互。
?
使用基于任務(wù)的方法。
?
處理依賴性。
本節(jié)將詳細(xì)討論這些問題。
優(yōu)選異步通訊
應(yīng)用程序在與位于網(wǎng)絡(luò)上的數(shù)據(jù)和服務(wù)交互時(shí),使用下列兩種通訊方法之一:
?
同步通訊。應(yīng)用程序被設(shè)計(jì)為在繼續(xù)處理之前期待響應(yīng)(例如,同步 RPC 通訊)。
?
異步通訊。應(yīng)用程序通過使用消息總線或其他某種基于消息的傳輸來(lái)進(jìn)行通訊,并且期待在請(qǐng)求和任何響應(yīng)之間存在延遲,或者根本不期待任何響應(yīng)。
注在本指南中,同步通訊是指在能夠繼續(xù)處理之前期待響應(yīng)的所有通訊,即使同步調(diào)用是在單獨(dú)的后臺(tái)線程上執(zhí)行的。
如果您要設(shè)計(jì)新的智能客戶端應(yīng)用程序,則應(yīng)該確保它在與位于網(wǎng)絡(luò)上的數(shù)據(jù)和服務(wù)交互時(shí)主要使用異步通訊。被設(shè)計(jì)為期待請(qǐng)求和響應(yīng)之間存在延遲的應(yīng)用程序非常適合于偶爾連接的用途,前提是該應(yīng)用程序在等待響應(yīng)的過程中能夠提供重要且有用的功能,并且在響應(yīng)延遲時(shí)不會(huì)妨礙用戶繼續(xù)完成他或她的工作。
當(dāng)該應(yīng)用程序未連接到網(wǎng)絡(luò)資源時(shí),您可以在本地存儲(chǔ)請(qǐng)求,并且在應(yīng)用程序重新連接時(shí)將這些請(qǐng)求發(fā)送到遠(yuǎn)程服務(wù)。無(wú)論是脫機(jī)還是聯(lián)機(jī),因?yàn)閼?yīng)用程序并不期待請(qǐng)求立即得到響應(yīng),所以都不會(huì)禁止用戶繼續(xù)使用該應(yīng)用程序,用戶可以繼續(xù)工作。
使用同步通訊的應(yīng)用程序(即使是在后臺(tái)線程上)不太適合于偶爾連接的用途。因此,您應(yīng)該在智能客戶端中盡可能減少對(duì)同步通訊的使用。如果您要將使用同步通訊的應(yīng)用程序重新設(shè)計(jì)為智能客戶端,則應(yīng)該確保它采用異步程度更高的通訊模型,以便它能夠脫機(jī)工作。但是,在許多情況下,您可以在異步基礎(chǔ)結(jié)構(gòu)之上實(shí)現(xiàn)類似于同步的通訊(稱為同步-異步模型),以便將應(yīng)用程序設(shè)計(jì)更改保持到最低限度。
將應(yīng)用程序設(shè)計(jì)為使用異步通訊可以為您帶來(lái)超越偶爾連接用途的好處。大多數(shù)設(shè)計(jì)為使用異步通訊的應(yīng)用程序都比那些使用同步通訊的應(yīng)用程序更加靈活。例如,可以在異步應(yīng)用程序正在執(zhí)行任務(wù)的過程中將其關(guān)閉,并且當(dāng)它重新啟動(dòng)時(shí)不會(huì)影響請(qǐng)求或響應(yīng)的處理。
在大多數(shù)情況下,您不需要在應(yīng)用程序中同時(shí)實(shí)現(xiàn)同步和異步行為以便在聯(lián)機(jī)和脫機(jī)時(shí)使用。異步行為同時(shí)適合于聯(lián)機(jī)和脫機(jī)使用;當(dāng)應(yīng)用程序聯(lián)機(jī)時(shí),請(qǐng)求會(huì)以接近于實(shí)時(shí)的速度進(jìn)行處理。
盡可能減少?gòu)?fù)雜的網(wǎng)絡(luò)交互
偶爾連接的智能客戶端應(yīng)該盡可能減少或消除與位于網(wǎng)絡(luò)上的數(shù)據(jù)和服務(wù)的交互。當(dāng)您的應(yīng)用程序脫機(jī)時(shí),它可能必須存儲(chǔ)請(qǐng)求并在應(yīng)用程序重新連接時(shí)發(fā)送這些請(qǐng)求,或者它可能需要針對(duì)響應(yīng)等待一會(huì)兒。無(wú)論采取哪種方式,應(yīng)用程序都不會(huì)立即知道請(qǐng)求是否即將成功或已經(jīng)成功。
要使應(yīng)用程序能夠在脫機(jī)時(shí)繼續(xù)工作,您必須就網(wǎng)絡(luò)請(qǐng)求的成功或本地?cái)?shù)據(jù)的更改進(jìn)行某些假設(shè)。跟蹤這些假設(shè)以及服務(wù)請(qǐng)求和數(shù)據(jù)更改之間的依賴性可能非常復(fù)雜。要減輕這一負(fù)擔(dān),您應(yīng)該盡可能地圍繞簡(jiǎn)單的網(wǎng)絡(luò)交互來(lái)設(shè)計(jì)您的智能客戶端應(yīng)用程序。
通常,不返回任何數(shù)據(jù)的請(qǐng)求(“發(fā)后不理”請(qǐng)求)對(duì)于偶爾連接的應(yīng)用程序來(lái)說不會(huì)成為問題;應(yīng)用程序可以存儲(chǔ)該請(qǐng)求并在重新連接時(shí)轉(zhuǎn)發(fā)該請(qǐng)求。當(dāng)應(yīng)用程序脫機(jī)時(shí),它不知道調(diào)用是否已經(jīng)成功;因此,該應(yīng)用程序必須假設(shè)調(diào)用已成功。這一假設(shè)可能影響后續(xù)處理。
如果請(qǐng)求返回應(yīng)用程序繼續(xù)工作所需要的數(shù)據(jù),則應(yīng)用程序必須使用暫定值或虛擬值,或者在沒有相應(yīng)數(shù)據(jù)的情況下工作。在此情況下,您需要將應(yīng)用程序設(shè)計(jì)為跟蹤暫定數(shù)據(jù)和已確認(rèn)的數(shù)據(jù),并且將用戶界面設(shè)計(jì)為使用戶知道暫定或掛起的數(shù)據(jù)。這使用戶或應(yīng)用程序能夠基于數(shù)據(jù)的有效性進(jìn)行明智的決策,并防止以后出現(xiàn)與數(shù)據(jù)沖突和損壞有關(guān)的問題。
如果用戶已經(jīng)在脫機(jī)狀態(tài)下完成了一些不連續(xù)的工作單元,則應(yīng)用程序應(yīng)該允許各個(gè)工作單元單獨(dú)成功或失敗。例如,在允許用戶輸入訂單信息的應(yīng)用程序中,應(yīng)用程序可以讓用戶根據(jù)需要輸入任意多的訂單,但該應(yīng)用程序必須確保一個(gè)訂單不必依賴于其他訂單的成功。
當(dāng)應(yīng)用程序?qū)τ诿總€(gè)工作單元只能產(chǎn)生一個(gè)服務(wù)請(qǐng)求時(shí),確保各個(gè)工作單元之間不存在依賴性是相對(duì)容易的。這使應(yīng)用程序可以跟蹤掛起的請(qǐng)求,并且可以在聯(lián)機(jī)后處理這些請(qǐng)求。但是,在某些情況下,用戶任務(wù)更為復(fù)雜,必須產(chǎn)生多個(gè)服務(wù)請(qǐng)求才能完成它們。在這些情況下,應(yīng)用程序必須確保每個(gè)請(qǐng)求都與其他請(qǐng)求一致,以便保持?jǐn)?shù)據(jù)一致性。
添加數(shù)據(jù)緩存功能
您的應(yīng)用程序需要確保在它脫機(jī)時(shí),客戶端能夠提供用戶繼續(xù)工作所需的所有數(shù)據(jù)。在某些情況下,您的應(yīng)用程序應(yīng)該出于性能原因在客戶端緩存數(shù)據(jù),但很多時(shí)候,您的應(yīng)用程序必須緩存額外的數(shù)據(jù)以滿足偶爾連接的用途。例如,您可能沒有為聯(lián)機(jī)使用的應(yīng)用程序緩存不穩(wěn)定的數(shù)據(jù),但要使同一應(yīng)用程序能夠脫機(jī)工作,則需要在本地計(jì)算機(jī)上緩存這些數(shù)據(jù)。客戶端和服務(wù)器端都必須進(jìn)行相應(yīng)的設(shè)計(jì)以考慮數(shù)據(jù)不穩(wěn)定性,以便它們可以適當(dāng)?shù)靥幚砀潞蜎_突。
當(dāng)應(yīng)用程序脫機(jī)時(shí),您可能選擇不從應(yīng)用程序數(shù)據(jù)緩存中刪除過時(shí)的數(shù)據(jù),而是使用這些過時(shí)的數(shù)據(jù)以使用戶能夠繼續(xù)工作。在其他情況下,應(yīng)用程序可能需要自動(dòng)從緩存中刪除這些數(shù)據(jù),以防止用戶使用它并在以后產(chǎn)生問題。在后一種情況下,在通過同步過程獲取新數(shù)據(jù)之前,應(yīng)用程序可能停止提供所需的功能。
根據(jù)應(yīng)用程序風(fēng)格和功能的不同,緩存中數(shù)據(jù)的刷新可能以多種方式發(fā)生。對(duì)于某些應(yīng)用程序,可以按照下列策略自動(dòng)刷新緩存的數(shù)據(jù):當(dāng)緩存的數(shù)據(jù)到期時(shí)刷新;按照某個(gè)時(shí)間表定期刷新;當(dāng)應(yīng)用程序執(zhí)行同步操作時(shí)刷新;或者當(dāng)服務(wù)器更改了數(shù)據(jù)并將相應(yīng)的更改通知應(yīng)用程序時(shí)刷新。其他應(yīng)用程序可能允許用戶手動(dòng)選擇要緩存的數(shù)據(jù),從而使用戶能夠在脫機(jī)狀態(tài)下分析或使用這些數(shù)據(jù)。
其他數(shù)據(jù)緩存注意事項(xiàng)同樣適用,如安全性約束和數(shù)據(jù)處理約束。這些問題并非只能在支持脫機(jī)操作的應(yīng)用程序中遇到,第 2 章:處理數(shù)據(jù)中對(duì)它們進(jìn)行了更為完整的介紹。
處理對(duì)引用數(shù)據(jù)的更改
引用數(shù)據(jù)是很少發(fā)生更改的數(shù)據(jù)。通常,應(yīng)用程序包含大量這樣的數(shù)據(jù)。例如,在客戶記錄中,客戶名稱很少更改??梢匀菀椎貙⑦@種類型的數(shù)據(jù)緩存在客戶端上,但有時(shí)您的引用數(shù)據(jù)將發(fā)生更改,而您必須具有某種將這些更改傳播到智能客戶端的機(jī)制。
您具有兩種傳播這些數(shù)據(jù)的選項(xiàng):推模型和拉模型。
在推模型中,服務(wù)器搶先通知客戶端并試圖將數(shù)據(jù)推出。在以數(shù)據(jù)為中心的方法中,這由復(fù)制客戶端數(shù)據(jù)存儲(chǔ)中被刷新的數(shù)據(jù)的服務(wù)器數(shù)據(jù)組成。在面向服務(wù)的方法中,這可能是包含已更新數(shù)據(jù)的消息。(這要求客戶端實(shí)現(xiàn)可供服務(wù)器連接到的終結(jié)點(diǎn)。)
在拉模型中,客戶端與服務(wù)器聯(lián)系以檢查是否存在更新??蛻舳丝梢酝ㄟ^定期檢查服務(wù)器做到這一點(diǎn),也可以通過分析帶有聲明引用數(shù)據(jù)何時(shí)到期的原始數(shù)據(jù)的元數(shù)據(jù)來(lái)做到這一點(diǎn)。客戶端甚至可能趁早從服務(wù)器拉數(shù)據(jù)(例如,價(jià)格表),并且僅當(dāng)它變?yōu)橛行r(shí)才使用它。
在某些情況下,您可能選擇采用這樣一種模型,即由服務(wù)器通知客戶端更新可用(例如,通過在客戶端連接時(shí)發(fā)送警報(bào)),然后客戶端從服務(wù)器拉數(shù)據(jù)。
管理連接
當(dāng)您設(shè)計(jì)偶爾連接的智能客戶端時(shí),應(yīng)該從以下兩個(gè)方面考慮應(yīng)用程序的工作環(huán)境:可用的連接性,以及應(yīng)用程序隨著該連接性的更改而需要具有的行為。
應(yīng)該將某些應(yīng)用程序設(shè)計(jì)為能夠在沒有連接的情況下長(zhǎng)時(shí)間地(數(shù)天,甚至數(shù)周)工作。而對(duì)于其他應(yīng)用程序,則應(yīng)該將其設(shè)計(jì)為總是期待連接,但能夠優(yōu)雅地處理連接臨時(shí)斷開連接的情況。某些應(yīng)用程序在脫機(jī)時(shí)應(yīng)該只提供功能子集,而其他應(yīng)用程序則應(yīng)該提供大部分功能以供脫機(jī)使用。
盡管許多偶爾連接方案都涉及到用戶從網(wǎng)絡(luò)顯式斷開連接,并在沒有連接的情況下工作,但有時(shí)應(yīng)用程序在未顯式從網(wǎng)絡(luò)斷開連接的情況下脫機(jī)??梢詫?yīng)用程序設(shè)計(jì)為能夠處理其中一種方案或能夠處理這兩種方案。
手動(dòng)連接管理
可以將應(yīng)用程序設(shè)計(jì)為能夠在用戶決定脫機(jī)工作時(shí)正常工作。應(yīng)用程序必須在本地計(jì)算機(jī)上存儲(chǔ)用戶可能需要的所有數(shù)據(jù)。在此情況下,用戶在與應(yīng)用程序交互時(shí)知道它處于脫機(jī)狀態(tài),而應(yīng)用程序不會(huì)試圖執(zhí)行網(wǎng)絡(luò)操作,直到它被明確告知聯(lián)機(jī)并執(zhí)行同步操作為止。
您還可以包括相應(yīng)的支持,以便用戶能夠在使用連接成本較高的連接或低帶寬連接(如商業(yè)無(wú)線熱點(diǎn)、移動(dòng)電話連接或撥號(hào)連接)時(shí)通知應(yīng)用程序。在此情況下,可以將應(yīng)用程序設(shè)計(jì)為對(duì)請(qǐng)求進(jìn)行批處理,以便在建立連接時(shí),能夠最大限度地利用它。
自動(dòng)連接管理
可以將應(yīng)用程序設(shè)計(jì)為能夠動(dòng)態(tài)適應(yīng)意外發(fā)生的連接性更改。這些更改可能包括下列情況:
?
間歇性的連接。可以將應(yīng)用程序設(shè)計(jì)為能夠適當(dāng)?shù)剡m應(yīng)或處理那些網(wǎng)絡(luò)連接臨時(shí)丟失的情況。某些應(yīng)用程序可能臨時(shí)掛起功能,直至應(yīng)用程序能夠重新聯(lián)機(jī)為止,而其他應(yīng)用程序則必須提供完整的功能。
?
不斷變化的連接質(zhì)量??梢詫?yīng)用程序設(shè)計(jì)為能夠預(yù)測(cè)網(wǎng)絡(luò)連接具有低帶寬或高延遲的情況,或者可以動(dòng)態(tài)確定這一情況并改變其行為以適應(yīng)其環(huán)境。如果連接質(zhì)量惡化,則應(yīng)用程序可以更為積極地緩存數(shù)據(jù)。
?
不斷變化的服務(wù)可用性??梢詫?yīng)用程序設(shè)計(jì)為能夠處理它通常與其交互的服務(wù)不可用的情況,并切換到它的脫機(jī)行為。如果應(yīng)用程序與多個(gè)服務(wù)交互,并且其中一個(gè)服務(wù)變得不可用,則它可能決定將所有服務(wù)都視為脫機(jī)服務(wù)。
您可以通過使用 wininet.dll 來(lái)檢測(cè)智能客戶端應(yīng)用程序是否具有連接。該 DLL 與 Microsoft Internet Explorer 用于確定用戶是否連接到 Internet 的 DLL 相同。下面的代碼示例顯示了如何調(diào)用 wininet.dll。
[DllImport("wininet.dll")] private extern static bool InternetGetConnectedState( out int connectionDescription, int reservedValue ) ; public bool IsConnected() { int connectionDescription = 0; return InternetGetConnectedState(out connectionDescription, 0); } 設(shè)計(jì)存儲(chǔ)轉(zhuǎn)發(fā)機(jī)制
如果您將應(yīng)用程序設(shè)計(jì)為使用面向服務(wù)的體系結(jié)構(gòu),則必須提供存儲(chǔ)轉(zhuǎn)發(fā)機(jī)制。通過存儲(chǔ)轉(zhuǎn)發(fā),可以創(chuàng)建、存儲(chǔ)消息并最終將其轉(zhuǎn)發(fā)到它們各自的目的地。最常見的存儲(chǔ)轉(zhuǎn)發(fā)實(shí)現(xiàn)是消息隊(duì)列。這就是面向消息的中間件產(chǎn)品(如 Microsoft 消息隊(duì)列)的工作方式。當(dāng)創(chuàng)建新的消息時(shí),它們將被放入消息隊(duì)列,并被轉(zhuǎn)發(fā)到它們的目標(biāo)地址。盡管還有其他存儲(chǔ)轉(zhuǎn)發(fā)替代機(jī)制(如 FTP 或在客戶端與服務(wù)器之間復(fù)制文件),但本指南將專門討論最常見的實(shí)現(xiàn):消息隊(duì)列。
智能客戶端需要一種在脫機(jī)時(shí)保留消息的方法。如果您的應(yīng)用程序需要在脫機(jī)時(shí)創(chuàng)建新消息,則您的隊(duì)列必須具有一種保留它們以便以后與服務(wù)器進(jìn)行更新的方法。這里,最顯而易見的選擇是將其寫入磁盤。
您的設(shè)計(jì)需要包括能夠確保將消息成功傳遞到其目的地的功能。您的設(shè)計(jì)應(yīng)該考慮下列情況:
?
缺少有關(guān)消息已正確發(fā)送的確認(rèn)。通常,您不應(yīng)該只是因?yàn)橄⒁呀?jīng)離開隊(duì)列就假設(shè)已在服務(wù)器收到該消息。
?
客戶端與服務(wù)器之間的連接丟失。在某些情況下,因?yàn)榭蛻舳伺c服務(wù)器之間的連接丟失,所以您必須從隊(duì)列返回消息。
?
缺少來(lái)自服務(wù)的確認(rèn)。在此情況下,您可能需要發(fā)送獨(dú)立的確認(rèn)以通知客戶端信息已收到。
存儲(chǔ)轉(zhuǎn)發(fā)機(jī)制還需要支持附加功能,如消息加密、優(yōu)先級(jí)化、鎖定和同步。
生成和設(shè)計(jì)可靠的消息處理體系結(jié)構(gòu)是一項(xiàng)復(fù)雜的任務(wù),要求有豐富的經(jīng)驗(yàn)和技能。因此,您應(yīng)該認(rèn)真地考慮一下商業(yè)產(chǎn)品,如 Microsoft 消息隊(duì)列。但是,Microsoft 消息隊(duì)列要求在客戶端上安裝軟件,這可能并非所有智能客戶端的選擇。
另一個(gè)消息隊(duì)列管理選擇是使用智能客戶端脫機(jī)應(yīng)用程序塊,它可在http://msdn.microsoft.com/library/en-us/dnpag/html/offline-CH01.asp 獲得。
該應(yīng)用程序塊提供了相關(guān)的服務(wù)和基礎(chǔ)結(jié)構(gòu),智能客戶端可用來(lái)向它們的應(yīng)用程序提供脫機(jī)功能。該應(yīng)用程序塊使用消息隊(duì)列概念支持消息處理的存儲(chǔ)轉(zhuǎn)發(fā)方法。默認(rèn)情況下,該應(yīng)用程序塊支持消息隊(duì)列集成以及其他一些消息保留機(jī)制(內(nèi)存、獨(dú)立存儲(chǔ)和 Microsoft SQL Server? 桌面引擎 [MSDE])。
管理數(shù)據(jù)和業(yè)務(wù)規(guī)則沖突
以脫機(jī)模式在應(yīng)用程序中進(jìn)行的更改必須在某個(gè)時(shí)刻與服務(wù)器同步或協(xié)調(diào)。這增加了發(fā)生沖突或發(fā)生應(yīng)用程序、用戶或管理員必須解決的其他問題的可能性。當(dāng)確實(shí)發(fā)生沖突時(shí),您必須確保能夠檢測(cè)并解決它們。
與數(shù)據(jù)沖突不同,發(fā)生業(yè)務(wù)規(guī)則沖突的原因不是在兩塊數(shù)據(jù)之間存在沖突,而是在某個(gè)地方違反了業(yè)務(wù)規(guī)則并且需要糾正。數(shù)據(jù)沖突和業(yè)務(wù)規(guī)則沖突都可能需要由客戶端應(yīng)用程序或用戶處理。
作為業(yè)務(wù)規(guī)則沖突的示例,假設(shè)您有一個(gè)訂單管理應(yīng)用程序,該應(yīng)用程序緩存了一個(gè)產(chǎn)品目錄,以便用戶能夠在脫機(jī)時(shí)將訂單輸入系統(tǒng)。然后,當(dāng)該應(yīng)用程序重新聯(lián)機(jī)時(shí),這些訂單將被轉(zhuǎn)發(fā)給服務(wù)器。如果某個(gè)訂單包含一種位于緩存的產(chǎn)品目錄中但在應(yīng)用程序重新聯(lián)機(jī)時(shí)已經(jīng)停止生產(chǎn)的產(chǎn)品,則當(dāng)訂單數(shù)據(jù)被轉(zhuǎn)發(fā)給服務(wù)器時(shí),服務(wù)器將檢查訂單詳細(xì)信息并且發(fā)現(xiàn)該產(chǎn)品已經(jīng)停止生產(chǎn)。此時(shí),應(yīng)用程序可以通知用戶該訂單有一個(gè)問題。如果所述產(chǎn)品已被替換或廢棄,則系統(tǒng)可以給予用戶切換到不同產(chǎn)品的能力。這種情況不是數(shù)據(jù)沖突(因?yàn)閿?shù)據(jù)沒有與任何內(nèi)容沖突),但這仍然是不正確的,并且需要糾正。
盡管業(yè)務(wù)規(guī)則異常和數(shù)據(jù)沖突是不同類型的異常,但大多數(shù)情況下,可以使用相同的基本方法和基礎(chǔ)結(jié)構(gòu)來(lái)處理它們。本節(jié)討論如何在智能客戶端應(yīng)用程序中處理數(shù)據(jù)和業(yè)務(wù)規(guī)則沖突。
數(shù)據(jù)分區(qū)和鎖定
任何允許多個(gè)用戶訪問共享數(shù)據(jù)的系統(tǒng)都有產(chǎn)生沖突的可能。當(dāng)您設(shè)計(jì)智能客戶端應(yīng)用程序時(shí),您必須確定它是否將數(shù)據(jù)分區(qū)以及如何執(zhí)行鎖定,因?yàn)檫@些因素有助于確定在應(yīng)用程序中發(fā)生沖突的可能性有多大。
數(shù)據(jù)分區(qū)
當(dāng)不同用戶對(duì)數(shù)據(jù)的不同部分具有控制權(quán)時(shí),可以使用數(shù)據(jù)分區(qū)。例如,銷售代表可能具有一些只分配給他或她的帳戶。在此情況下,您可以將數(shù)據(jù)分區(qū),以便只有銷售代表可以更改這些帳戶。以這種方式將數(shù)據(jù)分區(qū)后,可以允許用戶對(duì)數(shù)據(jù)進(jìn)行任意更改,而不必?fù)?dān)心遇到數(shù)據(jù)沖突。
將應(yīng)用程序設(shè)計(jì)為使用數(shù)據(jù)分區(qū)通常會(huì)受到很多限制,因此在許多情況下不是好的解決方案。但是,如果數(shù)據(jù)分區(qū)對(duì)于特定應(yīng)用程序是可行的,則應(yīng)該認(rèn)真地予以考慮,因?yàn)樗兄跍p少應(yīng)用程序所產(chǎn)生的沖突的數(shù)量。
保守式鎖定
保守式鎖定意味著系統(tǒng)使用互相排斥的鎖來(lái)確保一次只有一個(gè)用戶對(duì)系統(tǒng)數(shù)據(jù)進(jìn)行操作。對(duì)數(shù)據(jù)的所有請(qǐng)求都被序列化。例如,在出發(fā)之前,推銷員可能訪問數(shù)據(jù)庫(kù),并且邏輯地為特定地區(qū)的客戶簽出客戶帳戶。這一簽出操作可能要求在辦公室里更新一個(gè)電子表格,并且向其他人發(fā)送電子郵件以更新帳戶狀態(tài)?,F(xiàn)在,當(dāng)該推銷員出差時(shí),其余銷售人員就會(huì)明白該推銷員對(duì)這些客戶文件具有獨(dú)占的訪問權(quán),并且可以隨意進(jìn)行所需的任何修改。當(dāng)該推銷員回到辦公室并將新數(shù)據(jù)與服務(wù)器數(shù)據(jù)進(jìn)行同步時(shí),應(yīng)該沒有任何沖突。在同步數(shù)據(jù)之后,該推銷員將釋放邏輯鎖。
保守式鎖定的主要問題是:如果多個(gè)用戶需要同時(shí)對(duì)相同數(shù)據(jù)進(jìn)行操作,則他們必須等待數(shù)據(jù)變得可用。對(duì)于偶爾連接的智能客戶端,數(shù)據(jù)可能在某個(gè)客戶端重新聯(lián)機(jī)之前一直保持鎖定,而這一時(shí)間可能很長(zhǎng)。這就使得保守式鎖定在數(shù)據(jù)完整性方面很好(因?yàn)闆]有發(fā)生沖突的可能性),但在并發(fā)性方面卻很差。
實(shí)際上,保守式鎖定僅適合于幾種類型的偶爾連接應(yīng)用程序。例如,在文檔管理系統(tǒng)中,用戶在處理文檔時(shí)可能會(huì)有意地將文檔簽出一段持續(xù)很久的時(shí)間。但是,隨著可伸縮性和復(fù)雜性的提高,保守式鎖定正在成為一種不太可行的選擇。
開放式鎖定
大多數(shù)偶爾連接的智能客戶端應(yīng)用程序都使用開放式鎖定,它允許多個(gè)用戶并發(fā)地訪問和操作相同的數(shù)據(jù),并且假設(shè)各個(gè)用戶對(duì)數(shù)據(jù)進(jìn)行的更改將不會(huì)發(fā)生沖突。開放式鎖定允許對(duì)數(shù)據(jù)進(jìn)行高度并發(fā)性訪問,其代價(jià)是數(shù)據(jù)完整性將會(huì)降低。如果發(fā)生沖突,則需要一種能夠處理這些沖突的策略。
在大多數(shù)脫機(jī)方案中,您需要使用開放式鎖定。因此,您必須預(yù)料到會(huì)發(fā)生數(shù)據(jù)沖突,并且必須在確實(shí)發(fā)生數(shù)據(jù)沖突時(shí)對(duì)它們進(jìn)行協(xié)調(diào)。
跟蹤未確認(rèn)或暫定的數(shù)據(jù)
當(dāng)您的用戶脫機(jī)工作時(shí),他們已經(jīng)更改的任何數(shù)據(jù)都沒有被確認(rèn)為服務(wù)器上的更改。只有在這些數(shù)據(jù)已經(jīng)與服務(wù)器進(jìn)行合并而且沒有任何沖突之后,才能真正地將這些數(shù)據(jù)視為已確認(rèn)的數(shù)據(jù)。對(duì)未確認(rèn)的數(shù)據(jù)進(jìn)行跟蹤是很重要的。在已經(jīng)確認(rèn)數(shù)據(jù)之后,可以對(duì)其進(jìn)行標(biāo)記并適當(dāng)?shù)厥褂谩?div style="height:15px;">
您可能希望在應(yīng)用程序的用戶界面中以不同的顏色或字體顯示未確認(rèn)的數(shù)據(jù),以便用戶可以知道這些數(shù)據(jù)是暫定的。通常,在已經(jīng)確認(rèn)數(shù)據(jù)之前,您的應(yīng)用程序不應(yīng)該允許在多個(gè)任務(wù)中使用這些數(shù)據(jù)。這可以防止未確認(rèn)的數(shù)據(jù)溢出到其他需要已確認(rèn)數(shù)據(jù)的活動(dòng)中。使用已確認(rèn)的數(shù)據(jù)并不能保證將來(lái)不會(huì)發(fā)生沖突,但應(yīng)用程序起碼將知道數(shù)據(jù)曾經(jīng)被確認(rèn)過并且隨后已經(jīng)被某個(gè)用戶進(jìn)行了更改。
處理陳舊數(shù)據(jù)
即使數(shù)據(jù)尚未更改,它也可能因?yàn)椴辉偈亲钚聰?shù)據(jù)而變得不再正確。這樣的數(shù)據(jù)稱為陳舊數(shù)據(jù)。當(dāng)您設(shè)計(jì)智能客戶端應(yīng)用程序時(shí),您需要確定如何處理陳舊數(shù)據(jù)以及如何防止您的智能客戶端使用陳舊數(shù)據(jù)。這對(duì)于偶爾連接的智能客戶端而言尤其重要,因?yàn)閿?shù)據(jù)在客戶端首次脫機(jī)時(shí)可能是最新的,但在客戶端重新聯(lián)機(jī)之前可能變?yōu)殛惻f數(shù)據(jù)。此外,在客戶端上為最新的數(shù)據(jù)在到達(dá)服務(wù)器時(shí)可能成為陳舊數(shù)據(jù)。例如,推銷員可能在某個(gè)星期五使用有效數(shù)據(jù)為各種項(xiàng)目創(chuàng)建了一份訂單,但是如果他或她沒有在下個(gè)星期一之前將該訂單提交給服務(wù)器,則這些項(xiàng)目的費(fèi)用可能已經(jīng)更改。
注 如果在應(yīng)用程序重新聯(lián)機(jī)時(shí),對(duì)服務(wù)請(qǐng)求進(jìn)行排隊(duì)并且做好發(fā)送準(zhǔn)備,則該請(qǐng)求排隊(duì)的時(shí)間越長(zhǎng),它遇到數(shù)據(jù)沖突或異常的可能性就越大。例如,如果您將某個(gè)服務(wù)請(qǐng)求(該請(qǐng)求包含許多項(xiàng)目的訂單)排隊(duì),并且在很長(zhǎng)一段時(shí)間內(nèi)沒有發(fā)送該請(qǐng)求,則您訂購(gòu)的項(xiàng)目可能停止生產(chǎn)或脫銷。
您可以使用許多技術(shù)來(lái)處理陳舊數(shù)據(jù)。您可以使用元數(shù)據(jù)來(lái)說明數(shù)據(jù)的有效性并且顯示數(shù)據(jù)的到期時(shí)間。這可以防止將陳舊數(shù)據(jù)傳遞到客戶端。
在服務(wù)器上,您可以選擇對(duì)來(lái)自客戶端的任何數(shù)據(jù)進(jìn)行檢查,以確定它是否為陳舊數(shù)據(jù),然后再根據(jù)情況決定是否允許它與服務(wù)器上的數(shù)據(jù)進(jìn)行合并。如果該數(shù)據(jù)是陳舊數(shù)據(jù),則可以在將該數(shù)據(jù)重新提交給服務(wù)器之前,確??蛻舳烁缕湟脭?shù)據(jù)。
對(duì)于偶爾連接的應(yīng)用程序而言,陳舊數(shù)據(jù)的風(fēng)險(xiǎn)大于始終連接的應(yīng)用程序。因此,智能客戶端應(yīng)用程序通常會(huì)執(zhí)行附加的驗(yàn)證步驟以確保數(shù)據(jù)是有效的。通過向系統(tǒng)中添加額外的驗(yàn)證,您還可以確保您的服務(wù)對(duì)陳舊數(shù)據(jù)具有更高的容錯(cuò)性,并且在某些情況下,您或許能夠在服務(wù)器上自動(dòng)處理協(xié)調(diào)(即,將事務(wù)映射到新的帳戶)。
有時(shí)候,陳舊消息是無(wú)法避免的。處理陳舊數(shù)據(jù)的方式應(yīng)該以您要建模的業(yè)務(wù)的規(guī)則為基礎(chǔ)。在某些情況下,陳舊數(shù)據(jù)是可以接受的。例如,假設(shè)為聯(lián)機(jī)目錄中的特定項(xiàng)目提交了一個(gè)訂單。該項(xiàng)目具有一個(gè)目錄編號(hào),該編號(hào)由于聯(lián)機(jī)目錄更改已經(jīng)陳舊。但是,該項(xiàng)目仍然可用且尚未更改,目錄編號(hào)更改對(duì)系統(tǒng)沒有影響,并且將生成正確的訂單。
另一方面,如果您要在兩個(gè)帳戶之間執(zhí)行財(cái)務(wù)事務(wù),并且其中一個(gè)帳戶尚未關(guān)閉,則您無(wú)法執(zhí)行該事務(wù)。這里,數(shù)據(jù)的陳舊性確實(shí)很重要。
一個(gè)很好的一般性規(guī)則是讓業(yè)務(wù)對(duì)象為您處理陳舊數(shù)據(jù)的情況。您的業(yè)務(wù)對(duì)象可以驗(yàn)證數(shù)據(jù)是否是最新的,如果數(shù)據(jù)是陳舊的,則可以不做任何事情、用等效的最新數(shù)據(jù)協(xié)調(diào)陳舊數(shù)據(jù)、將信息傳回到客戶端以便更新或者使用業(yè)務(wù)規(guī)則自動(dòng)執(zhí)行適當(dāng)?shù)捻憫?yīng)。
陳舊數(shù)據(jù)的協(xié)調(diào)可能發(fā)生在客戶端、服務(wù)器或這兩者。在服務(wù)器處理協(xié)調(diào)可以使您的應(yīng)用程序容易地檢測(cè)到?jīng)_突。在客戶端處理協(xié)調(diào)可以免除那些可能需要手動(dòng)解決任何沖突的用戶或管理員的一些職責(zé)。
沒有處理陳舊數(shù)據(jù)的最佳方式。您的業(yè)務(wù)規(guī)則可能規(guī)定,如果客戶端無(wú)法解決沖突,則服務(wù)器是處理陳舊數(shù)據(jù)的最佳位置。如果服務(wù)器沒有足夠信息以自動(dòng)處理這種情況,則您需要要求客戶端在與服務(wù)器進(jìn)行同步之前清理它的數(shù)據(jù)。相反,您可能決定陳舊數(shù)據(jù)完全適合于您的應(yīng)用程序,在此情況下您沒有什么好擔(dān)心的。
協(xié)調(diào)沖突
當(dāng)您分析您所在組織的數(shù)據(jù)協(xié)調(diào)要求時(shí),您應(yīng)該考慮組織的工作方式。在某些情況下,因?yàn)椴煌挠脩糌?fù)責(zé)不同的數(shù)據(jù)元素,所以有可能發(fā)生沖突。在其他情況下,沖突將更為頻繁地發(fā)生,您必須確保您具有相應(yīng)的機(jī)制來(lái)處理它們。
無(wú)論您采取什么樣的預(yù)防措施,客戶端都有可能向網(wǎng)絡(luò)服務(wù)提交將導(dǎo)致違反業(yè)務(wù)規(guī)則或數(shù)據(jù)沖突的數(shù)據(jù)。當(dāng)沖突確實(shí)發(fā)生時(shí),遠(yuǎn)程服務(wù)應(yīng)該盡可能多地提供有關(guān)數(shù)據(jù)沖突的詳細(xì)信息。在某些情況下,數(shù)據(jù)沖突可能不是重大問題,并且可以由應(yīng)用程序或服務(wù)器自動(dòng)處理。例如,設(shè)想有一個(gè)客戶關(guān)系管理 (CRM) 系統(tǒng),并且用戶更改了某個(gè)客戶的電話號(hào)碼。在服務(wù)器上更新該更改時(shí),發(fā)現(xiàn)另一個(gè)用戶也已經(jīng)更改了該電話號(hào)碼。您可能選擇對(duì)您的系統(tǒng)進(jìn)行相應(yīng)的設(shè)計(jì),以便使最新的更改總是優(yōu)先,或者您可能希望將沖突發(fā)送給管理員。如果管理員知道是誰(shuí)在什么時(shí)候進(jìn)行了這些更改,則他或她就可以做出有關(guān)保留哪一個(gè)更改的決策。重要的一點(diǎn)在于服務(wù)器和應(yīng)用程序提供足夠的詳細(xì)信息以便進(jìn)行自動(dòng)處理,或者為用戶或管理員提供足夠的信息以便他或她能夠協(xié)調(diào)沖突。
數(shù)據(jù)協(xié)調(diào)可能是一個(gè)復(fù)雜且與具體情況有關(guān)的問題。每個(gè)業(yè)務(wù)和每個(gè)應(yīng)用程序都具有稍微不同的規(guī)則、要求和假設(shè)。然而,您具有三個(gè)一般性的數(shù)據(jù)協(xié)調(diào)選項(xiàng):
?
在服務(wù)器上自動(dòng)協(xié)調(diào)數(shù)據(jù)
?
在客戶端上自定義協(xié)調(diào)
?
第三方協(xié)調(diào)
依次考察一下上述每個(gè)選項(xiàng)是有用的。
在服務(wù)器上自動(dòng)協(xié)調(diào)數(shù)據(jù)
在某些情況下,您可以對(duì)您的應(yīng)用程序進(jìn)行相應(yīng)的設(shè)計(jì),以便服務(wù)器使用業(yè)務(wù)規(guī)則和自動(dòng)過程來(lái)處理沖突,而不會(huì)影響客戶端。您可以確保最新的更改總是優(yōu)先,合并兩個(gè)數(shù)據(jù)元素,或者采用更為復(fù)雜的業(yè)務(wù)邏輯。
在服務(wù)器上處理沖突對(duì)于可用性很有好處,并且使用戶免于過多地涉及協(xié)調(diào)過程或忍受該過程帶來(lái)的不便。您應(yīng)該始終通過某種方法使客戶端了解所采取的任何協(xié)調(diào)操作;例如,通過向客戶端返回協(xié)調(diào)報(bào)告,并且解釋沖突以及它的解決方式。這樣就使客戶端可以保持其本地?cái)?shù)據(jù)的一致性并且將協(xié)調(diào)結(jié)果通知用戶。
例如,假設(shè)應(yīng)用程序允許用戶為本地緩存的目錄中的項(xiàng)目輸入訂單信息。如果用戶訂購(gòu)的項(xiàng)目已經(jīng)停止生產(chǎn)并且由較新但類似的型號(hào)取代,則訂單服務(wù)可以選擇用新項(xiàng)目替換原來(lái)的項(xiàng)目。然后,將向客戶端通知該更改,以便它可以適當(dāng)?shù)匦薷乃谋镜貭顟B(tài)。
在客戶端上自定義協(xié)調(diào)
在某些情況下,客戶端是執(zhí)行協(xié)調(diào)的最佳位置,因?yàn)樗私庥嘘P(guān)原始請(qǐng)求的上下文的更多信息。應(yīng)用程序或許能夠自動(dòng)解決沖突。在其他情況下,用戶或管理員必須確定如何解決沖突。
要進(jìn)行有效的客戶端協(xié)調(diào),服務(wù)應(yīng)該向客戶端發(fā)送足夠的數(shù)據(jù),以使客戶端能夠就如何解決沖突進(jìn)行明智的決策。應(yīng)該將沖突的確切詳細(xì)信息報(bào)告給客戶端,以便該客戶端、用戶或管理員可以確定解決問題的最佳方式。
第三方協(xié)調(diào)
在某些情況下,您可能希望第三方來(lái)協(xié)調(diào)任何數(shù)據(jù)沖突。例如,可以要求管理員或超級(jí)用戶協(xié)調(diào)重要的數(shù)據(jù)沖突。他們可能是具有確定正確操作過程的職權(quán)的唯一用戶。在此情況下,需要通知客戶端決策已掛起??蛻舳嘶蛟S能夠通過使用暫定值繼續(xù)工作,但通常它必須等待至基礎(chǔ)沖突已經(jīng)解決為止。當(dāng)該沖突解決后,將通知客戶端。作為替代方法,客戶端還可以定期輪詢以確定狀態(tài),然后在收到協(xié)調(diào)值時(shí)繼續(xù)工作。
與類似于 CRUD 的 Web 服務(wù)交互
許多 Web 服務(wù)都是使用類似于 Create, Read, Update, Delete (CRUD) 的接口創(chuàng)建的。本節(jié)討論幾種用于創(chuàng)建消耗此類服務(wù)的偶爾連接應(yīng)用程序的策略。
Create
在 CRUD Web 服務(wù)中,創(chuàng)建記錄應(yīng)該是一項(xiàng)比較簡(jiǎn)單的任務(wù),前提是您能夠正確地管理記錄的創(chuàng)建。最重要的事情是唯一標(biāo)識(shí)所創(chuàng)建的每個(gè)記錄。大多數(shù)情況下,您可以通過使用唯一標(biāo)識(shí)符作為記錄的主鍵做到這一點(diǎn)。這樣,即使在不同的客戶端上創(chuàng)建了兩個(gè)看上去完全相同的記錄,在發(fā)生合并復(fù)制時(shí)也將把這些記錄視為不同的記錄。
注 在某些情況下,您可能不希望將記錄視為唯一的。在這些情況下,您可以在兩個(gè)記錄沖突時(shí)生成異常。
您可以使用多種方法在脫機(jī)客戶端上創(chuàng)建唯一標(biāo)識(shí)符。這些方法包括:
?
將記錄作為不帶唯一 ID 的數(shù)據(jù)傳輸對(duì)象 (DTO) 發(fā)送,并且讓服務(wù)器分配 ID。
?
使用客戶端可以分配的全局唯一標(biāo)識(shí)符 (GUID),如 System.Guid。
?
在客戶端上分配臨時(shí) ID,然后在服務(wù)器上用真正的 ID 替代它。
?
向每個(gè)客戶端分配一組唯一的 ID。
?
使用用戶的姓名或 ID 作為所有已分配的 ID 和句柄的前綴,并且在客戶端上遞增它們,以便它們?cè)谀J(rèn)情況下是全局唯一的。
Read
讀取操作沒有數(shù)據(jù)沖突,因?yàn)樽x取操作按照定義是只讀的。但是,對(duì)于偶爾連接的智能客戶端中的讀取操作而言,仍有可能發(fā)生問題。在客戶端脫機(jī)之前,您應(yīng)該在客戶端上緩存所有需要讀取的數(shù)據(jù)。該數(shù)據(jù)在客戶端重新聯(lián)機(jī)之前可能變?yōu)殛惻f數(shù)據(jù),從而導(dǎo)致客戶端上出現(xiàn)不準(zhǔn)確的數(shù)據(jù),并且在與服務(wù)器進(jìn)行同步時(shí)產(chǎn)生問題。有關(guān)處理陳舊數(shù)據(jù)的詳細(xì)信息,請(qǐng)參閱本章前面的“處理陳舊數(shù)據(jù)”。
Update
數(shù)據(jù)更新最有可能導(dǎo)致數(shù)據(jù)沖突,因?yàn)槎鄠€(gè)用戶可能更新相同的數(shù)據(jù),從而在合并復(fù)制發(fā)生時(shí)導(dǎo)致沖突。您可以使用多種方法將發(fā)生沖突的可能性將至最低,并且在沖突確實(shí)發(fā)生時(shí)解決它們。有關(guān)詳細(xì)信息,請(qǐng)參閱本章前面的“管理數(shù)據(jù)和業(yè)務(wù)規(guī)則沖突”。
Delete
刪除記錄是非常簡(jiǎn)單的,因?yàn)橛涗浿荒軇h除一次。嘗試刪除同一記錄兩次不會(huì)對(duì)系統(tǒng)產(chǎn)生任何影響。但是,在設(shè)計(jì)應(yīng)用程序和 Web 服務(wù)以處理刪除時(shí),您應(yīng)該記住幾點(diǎn)。首先,您應(yīng)該在客戶端上將相關(guān)記錄標(biāo)記為暫時(shí)刪除,然后在服務(wù)器上將刪除請(qǐng)求排隊(duì)。這意味著如果服務(wù)器由于某種原因無(wú)法刪除該記錄,則可以在客戶端上撤消刪除。
與創(chuàng)建記錄時(shí)一樣,您還必須通過使用唯一標(biāo)識(shí)符來(lái)確保您引用了相關(guān)記錄。這可以保證您總是在服務(wù)器上刪除了正確的記錄。
返回頁(yè)首
使用基于任務(wù)的方法
基于任務(wù)的方法使用對(duì)象將工作單元封裝為用戶任務(wù)。Task 對(duì)象負(fù)責(zé)處理用戶完成特定任務(wù)所需的狀態(tài)、服務(wù)和用戶界面交互。當(dāng)您設(shè)計(jì)和生成支持脫機(jī)操作的智能客戶端應(yīng)用程序時(shí),基于任務(wù)的方法尤其有用,因?yàn)樗鼓梢詫⒚摍C(jī)行為的細(xì)節(jié)封裝在單個(gè)位置。這使用戶界面可以專門致力于解決與 UI 有關(guān)的問題,而不是致力于解決處理邏輯。通常,單個(gè) Task 對(duì)象封裝(由用戶)與單個(gè)獨(dú)立工作單元相關(guān)聯(lián)的功能。任務(wù)的粒度和詳細(xì)信息將取決于確切的應(yīng)用程序方案。任務(wù)的一些示例包括:
?
輸入訂單信息。
?
對(duì)客戶聯(lián)系人詳細(xì)信息進(jìn)行更改。
?
撰寫并發(fā)送電子郵件。
?
更新訂單狀態(tài)。
對(duì)于上述每個(gè)任務(wù),都將實(shí)例化一個(gè) Task 對(duì)象并使用它來(lái)指導(dǎo)用戶完成該過程,存儲(chǔ)所有需要的狀態(tài),與用戶界面交互,并且與任何需要的服務(wù)交互。
當(dāng)應(yīng)用程序脫機(jī)工作時(shí),它需要將服務(wù)請(qǐng)求排隊(duì),并且可能使用暫定值或未確認(rèn)的值進(jìn)行本地狀態(tài)更改。在同步過程中,應(yīng)用程序需要執(zhí)行實(shí)際的服務(wù)請(qǐng)求,并且可能進(jìn)行更多的本地狀態(tài)更改以確認(rèn)服務(wù)請(qǐng)求的成功。通過將該過程的細(xì)節(jié)封裝在單個(gè) Task 對(duì)象(該對(duì)象將服務(wù)請(qǐng)求放入隊(duì)列中,并且跟蹤暫定的和已確認(rèn)的狀態(tài)更改)中,您可以簡(jiǎn)化應(yīng)用程序的開發(fā),隔離實(shí)現(xiàn)更改,并且能夠以標(biāo)準(zhǔn)方式處理所有任務(wù)。Task 對(duì)象可以通過各種屬性和事件提供有關(guān)任務(wù)狀態(tài)的詳細(xì)信息,包括:
?
Pending status。指示該任務(wù)是掛起的同步。
?
Confirmed status。指示該任務(wù)已經(jīng)同步并且確認(rèn)為成功。
?
Conflict status。指示在同步過程中發(fā)生了錯(cuò)誤。其他屬性將產(chǎn)生沖突或錯(cuò)誤的詳細(xì)信息。
?
Completed。指示完成的百分比或者將該任務(wù)標(biāo)志為已完成。
?
Task availability。當(dāng)應(yīng)用程序聯(lián)機(jī)或脫機(jī)時(shí),某些任務(wù)將不可用;或者,如果任務(wù)是某個(gè)工作流或用戶界面過程的一部分,則在已經(jīng)完成作為先決條件的任務(wù)之前,該任務(wù)可能不可用??梢詫⒃搶傩越壎ǖ讲藛雾?xiàng)或工具欄按鈕的啟用標(biāo)志,以防止用戶啟動(dòng)不適當(dāng)?shù)娜蝿?wù)。
基于任務(wù)的方法的另一項(xiàng)好處是:它使應(yīng)用程序可以致力于滿足用戶及其任務(wù)的需要,從而可以產(chǎn)生更為直觀的應(yīng)用程序。
返回頁(yè)首
處理依賴性
如果用戶任務(wù)涉及到一個(gè)以上的服務(wù)請(qǐng)求,則需要非常小心地處理該任務(wù),以便用戶可以在脫機(jī)時(shí)完成整個(gè)任務(wù)。困難在于服務(wù)請(qǐng)求通常是相互依賴的。例如,假設(shè)您具有一個(gè)允許為客戶預(yù)訂假期的應(yīng)用程序。為了預(yù)訂假期,應(yīng)用程序使用一些服務(wù),按以下順序執(zhí)行整個(gè)任務(wù)的各個(gè)部分:
1.
預(yù)訂汽車。
2.
預(yù)訂旅館房間。
3.
購(gòu)買飛機(jī)票。
4.
發(fā)送電子郵件確認(rèn)。
上述每個(gè)服務(wù)都可能由不同的系統(tǒng)(甚至可能由不同的公司)實(shí)現(xiàn)。在理想情況下,每個(gè)服務(wù)請(qǐng)求每次都能成功,以便您的用戶可以成功地預(yù)訂汽車、旅館和飛機(jī)票,并且應(yīng)用程序可以發(fā)送電子郵件以通知客戶端預(yù)訂了假期。但是,并非所有服務(wù)請(qǐng)求都是成功的,因此您的應(yīng)用程序必須能夠解決錯(cuò)誤條件,并且管理能夠影響它處理整個(gè)任務(wù)的方式的業(yè)務(wù)規(guī)則。為這種任務(wù)編寫代碼極為困難,因?yàn)樵撊蝿?wù)的各個(gè)部分(即,對(duì)特定服務(wù)的各個(gè)服務(wù)請(qǐng)求)都依賴于該任務(wù)的其他部分。
依賴性本身可能依賴于復(fù)雜的業(yè)務(wù)邏輯,這使影響整個(gè)任務(wù)的邏輯進(jìn)一步復(fù)雜化。例如,您的假期預(yù)訂應(yīng)用程序可能允許在沒有汽車的情況下預(yù)訂假期,前提是成功預(yù)訂了旅館和航班。各個(gè)服務(wù)請(qǐng)求之間的依賴性可以是正向 和反向 依賴性:
?
正向依賴性。在同步過程中,如果第一個(gè)請(qǐng)求成功,但隨后的請(qǐng)求失敗,則您可能需要通過補(bǔ)償事務(wù)反向第一個(gè)請(qǐng)求。這一要求可能大大增加應(yīng)用程序的復(fù)雜性。
?
反向依賴性。如果應(yīng)用程序正在脫機(jī)工作,并且將一個(gè)服務(wù)請(qǐng)求作為多服務(wù)請(qǐng)求任務(wù)的一部分提交,則它必須假設(shè)該請(qǐng)求將成功完成,以便它可以將后續(xù)的請(qǐng)求排隊(duì),并且不會(huì)妨礙用戶完成該任務(wù)。在此情況下,所有后續(xù)請(qǐng)求都依賴于第一個(gè)請(qǐng)求的成功。如果第一個(gè)請(qǐng)求在同步過程中失敗,則應(yīng)用程序必須知道所有后續(xù)請(qǐng)求都需要?jiǎng)h除或忽略。
在服務(wù)器處理依賴性
要降低與服務(wù)請(qǐng)求之間的依賴性相關(guān)聯(lián)的復(fù)雜性,Web 服務(wù)應(yīng)該為每個(gè)用戶任務(wù)提供單個(gè)服務(wù)請(qǐng)求。這就使用戶可以把將要在同步階段處理的任務(wù)作為對(duì) Web 服務(wù)的單個(gè)原子請(qǐng)求來(lái)完成。單個(gè)原子請(qǐng)求消除了跟蹤服務(wù)請(qǐng)求依賴性(這可能使應(yīng)用程序的客戶端或服務(wù)器端實(shí)現(xiàn)大大復(fù)雜化)的需要。
例如,您可以不像下面這樣將服務(wù)接口編寫為三個(gè)單獨(dú)的步驟:
BookCar() BookHotel() BookAirlineTickets()
而是將它們合并為一個(gè)步驟:
BookVacation( Car car, Hotel hotel, Tickets airlineTickets )
以這種方式合并步驟意味著,就客戶端而言,您現(xiàn)在擁有了一個(gè)原子交互而不是三個(gè)單獨(dú)的交互。在該示例中,BookVacation Web 服務(wù)將負(fù)責(zé)在構(gòu)成該服務(wù)的元素之間執(zhí)行必要的協(xié)調(diào)。
在客戶端處理依賴性
您還可以在客戶端上跟蹤服務(wù)請(qǐng)求依賴性。該方法提供了相當(dāng)大的靈活性,并且使客戶端可以控制任意數(shù)量服務(wù)之間的協(xié)調(diào)。但是,該方法難以開發(fā)和測(cè)試?;谌蝿?wù)的方法是在客戶端上跟蹤服務(wù)請(qǐng)求依賴性的好方法,并且提供了一種在一個(gè)位置封裝所需的全部業(yè)務(wù)邏輯和錯(cuò)誤處理的方法,從而簡(jiǎn)化了開發(fā)和測(cè)試。(有關(guān)基于任務(wù)的方法的詳細(xì)信息,請(qǐng)參閱本章前面的“使用基于任務(wù)的方法”。)
例如,用于預(yù)訂假期的 Task 對(duì)象將知道它必須執(zhí)行三個(gè)服務(wù)請(qǐng)求。它將實(shí)現(xiàn)必要的業(yè)務(wù)邏輯,以便它可以在遇到錯(cuò)誤條件時(shí)適當(dāng)?shù)乜刂品?wù)請(qǐng)求。如果 BookCar 服務(wù)調(diào)用失敗,它可以通過 BookHotel 和 BookAirlineTickets 服務(wù)調(diào)用繼續(xù)工作。如果 BookAirlineTickets 服務(wù)調(diào)用失敗,則它將負(fù)責(zé)通過向每個(gè)服務(wù)創(chuàng)建一個(gè)補(bǔ)償事務(wù)服務(wù)請(qǐng)求來(lái)取消任何旅館或汽車預(yù)訂。圖 4.2 闡明了這一基于任務(wù)的方法。
圖 4.2 帶有相互依賴性服務(wù)的基于任務(wù)的方法
使用編排中間件
有時(shí)候,應(yīng)用程序中的依賴性和相應(yīng)的業(yè)務(wù)規(guī)則十分復(fù)雜,需要某種形式的編排中間件(如 Microsoft BizTalk? Server)來(lái)協(xié)調(diào)多個(gè) Web 服務(wù)和一個(gè)客戶端應(yīng)用程序之間的交互。編排中間件位于中間層,并且提供了一個(gè)表面 Web 服務(wù)來(lái)與智能客戶端交互。表面 Web 服務(wù)向客戶端呈現(xiàn)了一個(gè)特定于應(yīng)用程序的適當(dāng)接口,通過該接口可以只為每個(gè)用戶任務(wù)產(chǎn)生單個(gè) Web 請(qǐng)求。當(dāng)收到服務(wù)請(qǐng)求時(shí),編排服務(wù)將通過啟動(dòng)并協(xié)調(diào)對(duì)必要 Web 服務(wù)的調(diào)用(可能首先對(duì)結(jié)果進(jìn)行整合,然后再將其返回到客戶端)來(lái)處理該請(qǐng)求。該方法提供了一種用于解決多個(gè) Web 服務(wù)之間交互的、可伸縮性更高的方法。BizTalk 還提供了重要的服務(wù),如數(shù)據(jù)轉(zhuǎn)換和業(yè)務(wù)規(guī)則引擎,這些服務(wù)可在與截然不同的 Web 服務(wù)或舊式系統(tǒng)交互時(shí)提供極大的幫助,還可以在復(fù)雜的業(yè)務(wù)情況下提供極大的幫助。另外,該方法還提供了重要的可用性和可靠性保證,從而有助于確保多個(gè)服務(wù)之間的一致性。圖 4.3 闡明了編排中間件的用法。
圖 4.3 用于協(xié)調(diào)服務(wù)依賴性的編排中間件
返回頁(yè)首
小結(jié)
智能客戶端需要在連接到網(wǎng)絡(luò)以及從網(wǎng)絡(luò)斷開連接時(shí)有效地工作。當(dāng)您設(shè)計(jì)智能客戶端時(shí),您需要確保它們可以在這兩種情況下有效地工作,并且能夠在這兩種情況之間無(wú)縫地轉(zhuǎn)換。
有兩種用于設(shè)計(jì)智能客戶端通訊的概括性的策略:面向服務(wù)的策略和以數(shù)據(jù)為中心的策略。當(dāng)您已經(jīng)確定使用哪種策略之后,您需要進(jìn)行一些基本的設(shè)計(jì)決策,以便使您的智能客戶端能夠脫機(jī)工作。在大多數(shù)情況下,應(yīng)該將客戶端設(shè)計(jì)為使用異步通訊和簡(jiǎn)單的網(wǎng)絡(luò)交互??蛻舳诵枰彺鏀?shù)據(jù)以便在脫機(jī)時(shí)使用,而且您需要一種在客戶端重新聯(lián)機(jī)后處理數(shù)據(jù)和業(yè)務(wù)規(guī)則沖突的方法。在許多情況下,脫機(jī)客戶端允許用戶執(zhí)行一些相互依賴的任務(wù)。您需要處理這些依賴性,以防其中某個(gè)任務(wù)到達(dá)服務(wù)器時(shí)發(fā)生失敗。您的智能客戶端還可能需要與類似于 CRUD 的 Web 服務(wù)交互。
基于任務(wù)的方法可以顯著簡(jiǎn)化將應(yīng)用程序脫機(jī)的過程。請(qǐng)考慮在您的智能客戶端中實(shí)現(xiàn)該方法;該方法還可以為您提供一種(在服務(wù)器和在客戶端)處理依賴性的有效方法。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
智能客戶端(架構(gòu)設(shè)計(jì))(二)
開發(fā)人員創(chuàng)建智能客戶端的十大理由
對(duì).Net平臺(tái)開發(fā)實(shí)踐的總結(jié).(5) - .NET教程 - CND8學(xué)院
一個(gè)通用即時(shí)通訊(IM)系統(tǒng)的設(shè)計(jì)
Citrix 聯(lián)機(jī)插件 應(yīng)用程序刷新不出來(lái)
常見安全漏洞
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服