減少用戶感知的響應(yīng)時(shí)間,提高用戶滿意度,提高平臺(tái)或解決方案的可擴(kuò)展性。盡可能地利用Ajax和緩存Ajax調(diào)用,可以提高用戶滿意度,提高可擴(kuò)展性。
對(duì)于新人或者不熟悉常見(jiàn)的網(wǎng)絡(luò)術(shù)語(yǔ)的人來(lái)說(shuō),可以把Ajax看作隱藏在下拉式菜單后的“方法”,當(dāng)你輸入字符串時(shí),可以以給你提示,或者把它看作隱藏在地圖服務(wù)中的“方法”,讓你能夠無(wú)需再次調(diào)用遠(yuǎn)程服務(wù)器,就能夠放大或縮小地圖。如果使用得當(dāng),利用Ajax不僅可以得到極好的與用戶互動(dòng)的界面,而且由于無(wú)需額外的服務(wù)器端工作就能讓用戶處理數(shù)據(jù)和對(duì)象并與之交互,還能提高可擴(kuò)展性。但是,如果使用不當(dāng),那么Ajax會(huì)極大地增加服務(wù)器需處理的請(qǐng)求數(shù),從而制造出一些特有的擴(kuò)展性約束。但要注意,雖然這些請(qǐng)求從瀏覽器端來(lái)看是異步的,卻可能在短時(shí)間內(nèi)造成服務(wù)器群內(nèi)的請(qǐng)求泛濫并造成服務(wù)器癱瘓。雖然常常被稱為一種技術(shù),但最好的描述還是瀏覽器用于創(chuàng)建更豐富的更具有交互性的Web應(yīng)用的一組技巧、語(yǔ)言、方法和技術(shù)的集合。雖然這個(gè)縮寫中的詞語(yǔ)描述了Ajax的實(shí)現(xiàn)方式,但真正的用戶交互可能不是異步的,不必只用XML作為數(shù)據(jù)交換的格式。例如,可以用JSON代替XML。但 Javascript是無(wú)可替代的。
Jesse James Garrett因在2005年發(fā)表的文章“Ajax:創(chuàng)建Web應(yīng)用的新方法”?中創(chuàng)造了術(shù)語(yǔ)Ajax而廣泛被人提及。寬泛地說(shuō),Ajax具有用CSS和 DHTML實(shí)現(xiàn)的標(biāo)準(zhǔn)表達(dá)方式、用文檔對(duì)象模型(DOM)實(shí)現(xiàn)的交互和動(dòng)態(tài)顯示能力、用XSLT或JSON實(shí)現(xiàn)的XML這樣的數(shù)據(jù)交換和操作機(jī)制,以及數(shù)據(jù)檢索機(jī)制。從終端用戶的角度看,數(shù)據(jù)檢索通常是異步的(但并不絕對(duì)必須是異步的)。 Javascript是用于實(shí)現(xiàn)客戶端瀏覽器內(nèi)交互的語(yǔ)言。當(dāng)使用異步數(shù)據(jù)傳輸時(shí),要采用Xmlhttprequest對(duì)象。我們最初的因特網(wǎng)經(jīng)驗(yàn)是所有東西都是請(qǐng)求和應(yīng)答這樣的交互,Ajax的目的就是終止這些復(fù)雜的交互。有了這些背景知識(shí),讓我們看看與Ajax相關(guān)的擴(kuò)展性方面需要注意的問(wèn)題,最后看看緩存如何幫助我們解決這些問(wèn)題。
顯然,我們一直想創(chuàng)建能夠提高用戶交互和滿意度的界面,這樣就能夠增加收益、利潤(rùn)和股東的財(cái)富。Ajax就是這樣一種方法,利用它可以給最終用戶提供更豐富更實(shí)時(shí)的體驗(yàn)。由于它能減少瀏覽器內(nèi)不必要的交互,所以用戶交互可以發(fā)生得更快。用戶可以進(jìn)行放大或縮小操作,而無(wú)需等待服務(wù)器的響應(yīng),可以用以前的條目預(yù)填充下拉式菜單,當(dāng)用戶在搜索欄中輸人查詢字符串時(shí),他們可以看得一些潛在搜索字符串,從中他們也許會(huì)找到更具有指導(dǎo)性的搜索條件。利用Ajax的異步性,無(wú)需讓用戶點(diǎn)擊“下一頁(yè)”,就可以根據(jù)某些用戶操作反復(fù)接收郵件,幫助我們把郵件結(jié)果載入客戶瀏覽器。
但是有些操作會(huì)不利于對(duì)平臺(tái)進(jìn)行有效擴(kuò)展。以用戶在Web站點(diǎn)輸搜察項(xiàng)搜索持定的產(chǎn)品為例。我們可能想在用人搜索項(xiàng)時(shí),彈出一個(gè)下拉式菜單,列出一些建議的搜索項(xiàng),這樣我們需要查詢產(chǎn)品目錄來(lái)填充菜單。Ajax響應(yīng)后繼的擊鍵把請(qǐng)求發(fā)送給服務(wù)器器,基于迄今為止輸人的字符串返回一個(gè)結(jié)果填充下拉式菜單,而用戶在輸人時(shí)無(wú)需瀏覽器刷新頁(yè)面。否則,可能會(huì)由于用戶還沒(méi)有輸人完整的字符串,而返回不完整字符串的完整搜索結(jié)果。這兩種實(shí)現(xiàn)在許多搜索引和電子商務(wù)站點(diǎn)都很常見(jiàn)。但是,讓每個(gè)后繼的擊鍵都對(duì)服務(wù)器產(chǎn)生一個(gè)搜索查詢,對(duì)后臺(tái)系統(tǒng)來(lái)說(shuō),不僅成本高,而且是一種浪費(fèi)。例如,用戶輸入“ beanie baby”會(huì)引發(fā)111次連續(xù)的搜索,而真正需要的只有一次。這樣的用戶體驗(yàn)可能令人印象深刻,但是如果用戶輸人足夠快,那么在結(jié)束輸人前可能有8到10個(gè)搜索都不會(huì)真正返回結(jié)果。
還有一種方法,能夠在不增加10倍流量的情況下達(dá)到相同的目標(biāo),你也許能根據(jù)本章的主題猜到這種方法,那就是利用緩存。只需要很少的工作,就可以把上一次Ajax交互的結(jié)果緩存在客戶瀏覽器中、也可能是緩存在CDN(請(qǐng)參閱原則20)、頁(yè)面緩存(請(qǐng)參閱原則23)、應(yīng)用緩存(請(qǐng)參閱原則24)中。首先,讓我們看看如何利用瀏覽器的緩存。三個(gè)能確保我們?cè)跒g覽器中緩存內(nèi)容的關(guān)鍵元素是HTTP響應(yīng)中的cache- contro1頭、Expires頭和Last-Modified頭。我們?cè)谠瓌t21中詳細(xì)討論過(guò)其中的兩個(gè)。對(duì)于 Cache-Contro1,要避免使用no- store,在可能的地方把它設(shè)置為 public,這樣我們的終端(客戶)和服務(wù)器之間的任何代理和緩存(如CDN)都可以保存結(jié)果集,向其他請(qǐng)求提供數(shù)據(jù)。當(dāng)然,我們不想把私有數(shù)據(jù)設(shè)置為 public,但在可能的情況下,我們當(dāng)然想利用pub1ic提供的高度緩存。
記住,我們的目標(biāo)是減往而少服務(wù)器的負(fù)載。因此,應(yīng)該把響應(yīng)的 Expires頭的時(shí)間設(shè)置得足夠長(zhǎng),才能使瀏覽器在本地緩存第一個(gè)查詢的結(jié)果,以便之后的請(qǐng)求能夠從緩存中讀取它。對(duì)于靜態(tài)對(duì)象和半靜態(tài)對(duì)象,如用戶頭像或公司標(biāo)志
可以把 Expires設(shè)置為幾天或時(shí)間更長(zhǎng)一些。有些對(duì)象肯定對(duì)時(shí)間敏感,如讀取朋友博客上的狀態(tài)更新。對(duì)于這種情況,可以把 Expires頭設(shè)置為幾秒或幾分鐘,這樣既考慮到了實(shí)時(shí)性,又減少了全局負(fù)載。
使用Last- Modified頭可以處理有條件的GE請(qǐng)求。在這種情況下,為了與HTTP1.1協(xié)議保持一致,如果緩存中的數(shù)據(jù)項(xiàng)是正確的或仍然有效,服務(wù)器應(yīng)該用狀態(tài)304響應(yīng)。如Xmlhttpreuqest這個(gè)名字的Http部分所示,所有這些的關(guān)鍵在于,Ajax請(qǐng)求的表現(xiàn)與其他任何HTTP請(qǐng)求和響應(yīng)的表現(xiàn)一樣。知道了這些,有助于確保支持這些請(qǐng)求的系統(tǒng)的緩存能力、可用性和可擴(kuò)展性。
當(dāng)我們的內(nèi)容在瀏覽器端可以更改時(shí),前面的方法很有效,但對(duì)于逐漸擴(kuò)展的搜索字符串,問(wèn)題就變得有點(diǎn)困難了,在用戶與搜索頁(yè)面交互,并輸入檢索字符串時(shí),就會(huì)出現(xiàn)這種情況。對(duì)于這種特殊情況,沒(méi)有簡(jiǎn)單的解決方案。但在 cache- ontic1頭中使用pub1iC參數(shù)可以確保把所有相近的搜索字符串都緩存到中間緩存和代理中。因此,被搜索字符串的常見(jiàn)開(kāi)頭和常見(jiàn)的中間部分很可能在讀取它們之前就已經(jīng)被緩存在某處了。這種特殊問(wèn)題可以推廣到利用Ajax的頁(yè)面中的其他特定對(duì)象上。例如,請(qǐng)求拍賣中的物品的系統(tǒng)、請(qǐng)求社交網(wǎng)站站中的消息的系統(tǒng)或者郵件系統(tǒng),在發(fā)出請(qǐng)求時(shí),不應(yīng)該使用相對(duì)位移量,而應(yīng)該使用特定的消息ID。像"page=3&item=2”這樣的相對(duì)名字,標(biāo)識(shí)的是系統(tǒng)的第三頁(yè)中的第二條消息,隨著系統(tǒng)的改變,可能會(huì)造成緩存一致性問(wèn)題。較好的方法是使用id=124556”,這個(gè)ID表示一個(gè)原子項(xiàng)目,不會(huì)改變可以為這個(gè)用戶進(jìn)行緩存,如果它的屬性是公共的,那么將來(lái)還可以被
較容易解決的情況是我們知道自己有哪些網(wǎng)站制作靜態(tài)或半靜態(tài)的項(xiàng)目集合,例如有限的或者上下文相關(guān)的產(chǎn)品目錄。從客戶端來(lái)看,我們可以異步獲取這些結(jié)果,把它們緩存起來(lái),可以供同一個(gè)客戶將來(lái)使用,更重要的是確保CDN和中間緩存或代理程序緩存了它,以便其他用戶執(zhí)行相近的搜索時(shí)使用。
本文地址:http://m.cdrpkj.cn//article/3474.html