大並發伺服器不得不說的技術–http 緩衝

來源:互聯網
上載者:User

前面所說技術訂都是伺服器端一個人在努力,有時候也需要用戶端配合。

一個連結請求過程大致可以分成幾個階段

如果用戶端發送同樣的請求,且結果都一樣,我們是不是可以緩衝一下呢?是不是可以減少幾步呢? 

的確可以,一般來說以下幾種方法:

1.我們先試著在服務端進行緩衝,我們試著將一個已經返回的長連結發送內容不作釋放,下次請求時直接返回剛才發送的內容,這個不適用於頻繁訪問,適用於一些特殊的情況,特殊的請求。

2.對於靜態檔案都有上次修改時間lastupdatetime,用戶端第一次請求返回的http頭包含這個 lastupdatetime,接著用戶端將頁面加到緩衝裡,第二次要求標頭裡包含lastupdatetime,服務端將它和當前的lastupdatetime 進行比較,如果一樣,直接告訴用戶端檔案還沒修改,直接用你緩衝裡的。

實際上http返回頭存更新時間的欄位是Last-Modified,要求標頭的欄位是If-Modified-Since

返回包頭

HTTP/1.1 200 OK
Date: Wed, 20 Mar 2013 07:35:22 GMT
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Last-Modified: Wed, 20 Mar 2013 07:35:22 GMT
Transfer-Encoding: chunked
Server: yumeiz

請求包頭

GET / HTTP/1.1 
Host: www.xxx.com
Connection: keep-alive 
If-Modified-Since: Wed, 20 Mar 2013 07:35:22 GMT

再次返回包頭:

HTTP/1.1 304 Not Modified

對於一些沒有修改時間的動態請求,服務端可以約定一個欄位,當第二次請求發現這個欄位沒變,也告訴用戶端直接用緩衝裡的內容。

實際上這個欄位是ETag,要求標頭的欄位是If-None-Match

返回包頭(只點到相應欄位,其他與上面一致)

ETag="ABCD" 

請求包頭

If-None-Match=W/"ABCD"

通過上面我們知道當用戶端收到一個 304 Not Modified 的包頭時,就意味著可以直接用緩衝裡的頁面,對一些頻繁請求的檔案如JS,CSS有不小的作用,還有一些塊頭很大的影像檔,意味著送去了救命道草。。。

3.上面的幾種方法實際上都需要服務端參與,我們知道有些檔案如JS,CSS,HTML,改變的頻率實在太小,但是請求的頻率又實在太大,有請求就有壓力,服務端就算返回304也還有很大的並發壓力,那麼是不是可以讓用戶端直接用緩衝裡而不再確認呢?

還記得cookie有個到期時間嗎,請求也可以有到期時間,當這個請求還沒到期的情況下再次請求,用戶端直接載入緩衝的頁面,不再確認,no check, no link, no server!

這樣就徹底與伺服器失去的聯絡,給伺服器減輕多少壓力,減少了多少頻寬。。。

實際上這個這個欄位是 Expires

HTTP/1.1 200 OK
Date: Wed, 20 Mar 2013 07:35:22 GMT
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Expires: Wed, 20 Mar 2013 08:01:22 GMT
Transfer-Encoding: chunked
Server: yumeiz

還有一個欄位 max-age,作用一樣,而且可以覆蓋Expires。

max-age意思就是從現在開始,這個頁面要經過多少秒才到期。

max-age 的使用方式:

Cache-Control:max-age=3600

回頭看看,第1,2種方法其實是省略了服務端的業務處理,第3種方法是壓根兒沒服務端啥事了,相當於一段時間內離線處理,雖然有悖於互聯的精神,但是確實能解決問題。

以上幾種方法也可以混合使用,如返回包頭同時包含expires和Last-Modified,如

HTTP/1.1 200 OK
Date: Wed, 20 Mar 2013 07:35:22 GMT
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Last-Modified: Wed, 20 Mar 2013 03:35:22 GMT
Expires: Wed, 20 Mar 2013 08:01:22 GMT
Transfer-Encoding: chunked
Server: yumeiz

當expires沒有到期前直接用用戶端的緩衝,如果到期了則再請求服務端,服務端檢查檔案修改時間沒變則返回304,同時重新整理expires.

如:

HTTP/1.1 304 Not Modified
Server: yumeiz
Date: Wed, 20 Mar 2013 08:02:22 GMT
Vary: Accept-Encoding
Last-Modified: Wed, 20 Mar 2013 03:35:22 GMT
Expires: Wed, 20 Mar 2013 08:35:22 GMT
Cache-Control: max-age=31536000

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.