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