一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

使用ETags減少Web應(yīng)用帶寬和負(fù)載第1/2頁(yè)

介紹

最近,大眾對(duì)于REST風(fēng)格應(yīng)用架構(gòu)表現(xiàn)出強(qiáng)烈興趣,這表明Web的優(yōu)雅設(shè)計(jì)開(kāi)始受到人們的注意。現(xiàn)在,我們逐漸理解了“3W架構(gòu)(Architecture of the World Wide Web)”內(nèi)在所蘊(yùn)含的可伸縮性和彈性,并進(jìn)一步探索運(yùn)用其范式的方法。本文中,我們將探究一個(gè)可被Web開(kāi)發(fā)者利用的、鮮為人知的工具,不引人注意的“ETag響應(yīng)頭(ETag Response Header)”,以及如何將它集成進(jìn)基于Spring和Hibernate的動(dòng)態(tài)Web應(yīng)用,以提升應(yīng)用程序性能和可伸縮性。

我們將要使用的Spring框架應(yīng)用是基于“寵物診所(petclinic)”的。下載文件中包含了關(guān)于如何增加必要的配置及源碼的說(shuō)明,你可以自己嘗試。

什么是“ETag”?

HTTP協(xié)議規(guī)格說(shuō)明定義ETag為“被請(qǐng)求變量的實(shí)體值” (參見(jiàn) http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html ―― 章節(jié) 14.19)。 另一種說(shuō)法是,ETag是一個(gè)可以與Web資源關(guān)聯(lián)的記號(hào)(token)。典型的Web資源可以一個(gè)Web頁(yè),但也可能是JSON或XML文檔。服務(wù)器單獨(dú)負(fù)責(zé)判斷記號(hào)是什么及其含義,并在HTTP響應(yīng)頭中將其傳送到客戶端。

ETag如何幫助提升性能?

聰明的服務(wù)器開(kāi)發(fā)者會(huì)把ETags和GET請(qǐng)求的“If-None-Match”頭一起使用,這樣可利用客戶端(例如瀏覽器)的緩存。因?yàn)?a href=/yuedu/fuwuqi/ target=_blank class=infotextkey>服務(wù)器首先產(chǎn)生ETag,服務(wù)器可在稍后使用它來(lái)判斷頁(yè)面是否已經(jīng)被修改。本質(zhì)上,客戶端通過(guò)將該記號(hào)傳回服務(wù)器要求服務(wù)器驗(yàn)證其(客戶端)緩存。

其過(guò)程如下:

  1. 客戶端請(qǐng)求一個(gè)頁(yè)面(A)。
  2. 服務(wù)器返回頁(yè)面A,并在給A加上一個(gè)ETag。
  3. 客戶端展現(xiàn)該頁(yè)面,并將頁(yè)面連同ETag一起緩存。
  4. 客戶再次請(qǐng)求頁(yè)面A,并將上次請(qǐng)求時(shí)服務(wù)器返回的ETag一起傳遞給服務(wù)器
  5. 服務(wù)器檢查該ETag,并判斷出該頁(yè)面自上次客戶端請(qǐng)求之后還未被修改,直接返回響應(yīng)304(未修改――Not Modified)和一個(gè)空的響應(yīng)體。

本文的其余部分將展示在基于Spring框架的Web應(yīng)用中利用ETag的兩種方法,該應(yīng)用使用Spring MVC。首先我們將使用Servlet 2.3 Filter,利用展現(xiàn)視圖(rendered view)的MD5校驗(yàn)和(checksum)以實(shí)現(xiàn)生成ETag的方法(一個(gè)“淺顯的”ETag實(shí)現(xiàn))。 第二種方法使用更為復(fù)雜的方法追蹤view中所使用的model,以確定ETag有效性(一個(gè)“深入的”ETag實(shí)現(xiàn))。盡管我們使用的是Spring MVC,但該技術(shù)可以應(yīng)用于任何MVC風(fēng)格的Web框架。

在我們繼續(xù)之前,強(qiáng)調(diào)一下這里所展現(xiàn)的是提升動(dòng)態(tài)產(chǎn)生頁(yè)面性能的技術(shù)。已有的優(yōu)化技術(shù)也應(yīng)作為整體優(yōu)化和應(yīng)用性能特性調(diào)整分析的一部分來(lái)考慮。(見(jiàn)下)。

自頂向下的Web緩存

本文主要涉及對(duì)動(dòng)態(tài)生成頁(yè)面使用HTTP緩存技術(shù)。當(dāng)考慮提升Web應(yīng)用的性能的時(shí)候,應(yīng)采取一個(gè)整體的、自頂向下的方法。為了這一目的,理解HTTP請(qǐng)求經(jīng)過(guò)的各層是很重要的,應(yīng)用哪些適當(dāng)?shù)募夹g(shù)取決于你所關(guān)注的熱點(diǎn)。例如:

  • 將Apache作為Servlet容器的前端,來(lái)處理如圖片和Javascript腳本這樣的靜態(tài)文件,而且還可以使用FileETag指令創(chuàng)建ETag響應(yīng)頭。
  • 使用針對(duì)Javascript文件的優(yōu)化技術(shù),如將多個(gè)文件合并到一個(gè)文件中以及壓縮空格。
  • 利用GZip和緩存控制頭(Cache-Control headers)。
  • 為確定你的Spring框架應(yīng)用的痛處所在,可以考慮使用 JamonPerformanceMonitorInterceptor。
  • 確信你充分利用ORM工具的緩存機(jī)制,因此對(duì)象不需要從數(shù)據(jù)庫(kù)中頻繁的再生。花時(shí)間確定如何讓查詢緩存為你工作是值得的。
  • 確保你最小化數(shù)據(jù)庫(kù)中獲取的數(shù)據(jù)量,尤其是大的列表。如果每個(gè)頁(yè)面只請(qǐng)求大列表的一個(gè)小子集,那么大列表的數(shù)據(jù)應(yīng)由其中某個(gè)頁(yè)面一次獲得。
  • 使放入到HTTP session中的數(shù)據(jù)量最小。這樣內(nèi)存得到釋放,而且當(dāng)將應(yīng)用集群的時(shí)候也會(huì)有所幫助。
  • 使用數(shù)據(jù)庫(kù)明細(xì)(database profiling)工具來(lái)查看在查詢的時(shí)候使用了什么索引,在更新的時(shí)候整個(gè)表沒(méi)有被上鎖。

當(dāng)然,應(yīng)用性能優(yōu)化的至理名言是:兩次測(cè)量,一次剪裁(measure twice, cut once)。哦,等等,這是對(duì)木工而言的!沒(méi)錯(cuò),但是它在這里也很適用!

ETag Filter內(nèi)容體

我們要考慮的第一種方法是創(chuàng)建一個(gè)Servlet Filter,它將基于頁(yè)面(MVC中的“View”)的內(nèi)容產(chǎn)生其ETag 記號(hào)。乍一看,使用這種方法所獲得的任何性能提升看起來(lái)都是違反直覺(jué)的。我們?nèi)匀徊坏貌划a(chǎn)生頁(yè)面,而且還增加了產(chǎn)生記號(hào)的計(jì)算時(shí)間。然而,這里的想法是減少帶寬使用。在大的響應(yīng)時(shí)間情形下,如你的主機(jī)和客戶端分布在這個(gè)星球的兩端,這很大程度上是有益的。我曾見(jiàn)過(guò)東京辦公室使用紐約服務(wù)器上托管的應(yīng)用,其響應(yīng)時(shí)間達(dá)到了 350 ms。隨著并發(fā)用戶數(shù)的增長(zhǎng),這將變成巨大的瓶頸。

代碼

我們用來(lái)產(chǎn)生記號(hào)的技術(shù)是基于從頁(yè)面內(nèi)容計(jì)算MD5哈希值。這通過(guò)在響應(yīng)之上創(chuàng)建一個(gè)包裝器來(lái)實(shí)現(xiàn)。該包裝器使用字節(jié)數(shù)組來(lái)保存所產(chǎn)生的內(nèi)容,在filter鏈處理完成之后我們利用數(shù)組的MD5哈希值計(jì)算記號(hào)。

doFilter方法的實(shí)現(xiàn)如下所示。
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
ServletException {
HttpServletRequest servletRequest = (HttpServletRequest) req;
HttpServletResponse servletResponse = (HttpServletResponse) res;

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
ETagResponseWrapper wrappedResponse = new ETagResponseWrapper(servletResponse, baos);
chain.doFilter(servletRequest, wrappedResponse);

  byte[] bytes = baos.toByteArray();

  String token = '"' + ETagComputeUtils.getMd5Digest(bytes) + '"';
servletResponse.setHeader("ETag", token); // always store the ETag in the header

  String previousToken = servletRequest.getHeader("If-None-Match");
if (previousToken != null && previousToken.equals(token)) { // compare previous token with current one
logger.debug("ETag match: returning 304 Not Modified");
servletResponse.sendError(HttpServletResponse.SC_NOT_MODIFIED);
// use the same date we sent when we created the ETag the first time through
servletResponse.setHeader("Last-Modified", servletRequest.getHeader("If-Modified-Since"));
} else  { // first time through - set last modified time to now
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MILLISECOND, 0);
Date lastModified = cal.getTime();
servletResponse.setDateHeader("Last-Modified", lastModified.getTime());

  logger.debug("Writing body content");
servletResponse.setContentLength(bytes.length);
ServletOutputStream sos = servletResponse.getOutputStream();
sos.write(bytes);
sos.flush();
sos.close();
}
}

php技術(shù)使用ETags減少Web應(yīng)用帶寬和負(fù)載第1/2頁(yè),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 岛国最新资源网站 | 91麻豆精品国产剧情 | 四虎影视国产在线观看精品 | 91精品啪在线观看国产91九色 | 美女被男人狂躁免费视频 | 色婷婷视频 | 久久伊人热精品老鸭窝 | 在线色视频网站 | 国产免费一区二区 | 91精品国产91 | 99视频精品全部免费观看 | 99久久精品免费看国产一区二区 | 国产精品视频一区二区三区w | 精品一二三四区 | 久久最新网址 | 国产成人综合亚洲欧洲色就色 | 国产成人无精品久久久久国语 | 久久无码精品一区二区三区 | 在线观看色视频网站 | 国产精品亚洲欧美一级久久精品 | 亚洲一区日韩一区欧美一区a | 欧美特黄一免在线观看 | 国产成人免费高清视频 | 狠狠色噜噜狠狠狠狠米奇7777 | 国产精品欧美亚洲 | 亚洲一区二区在线成人 | 成人欧美视频免费看黄黄 | 国产91在线播放中文 | 亚洲一区综合 | 激情五月开心婷婷 | 国产精品第二页在线播放 | 91视频啪| 欧美日韩中文亚洲另类春色 | 国产福利小视频在线 | 韩国精品一区二区久久 | 亚洲成人综合在线 | 一级a性色生活片久久毛片 一级爱爱片一级毛片-一毛 | 91视频网址 | 国产午夜精品视频 | 欧美日韩加勒比一区二区三区 | 99视频精品全部国产盗摄视频 |