99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

(八)Connect模塊解析(之二)靜態(tài)文件中間件

2018-02-24 16:10 更新

上一篇專(zhuān)欄簡(jiǎn)單介紹了Connect模塊的基本架構(gòu),它的執(zhí)行模型十分簡(jiǎn)單,中間件機(jī)制也使得它十分易于擴(kuò)展,具備良好的可伸縮性。在Connect的良好機(jī)制下,我們本章開(kāi)始將逐步解開(kāi)Connect生態(tài)圈中中間件部分,這部分給予Connect良好的功能擴(kuò)展。

靜態(tài)文件中間件

也許你還記得我曾經(jīng)寫(xiě)過(guò)的Node.js靜態(tài)文件服務(wù)器實(shí)戰(zhàn),那篇文章中我敘述了如何利用Node.js實(shí)現(xiàn)一個(gè)靜態(tài)文件服務(wù)器的許多技術(shù)細(xì)節(jié),包括路由實(shí)現(xiàn),MIME,緩存控制,傳輸壓縮,安全、歡迎頁(yè)、斷點(diǎn)續(xù)傳等。但是這里我們不需要去親自處理細(xì)節(jié),Connectstatic中間件為我們提供上述所有功能。代碼只需寥寥3行即可:

var connect = require('connect');  
var app = connect(); 
app.use(connect.static(__dirname + '/public')); 

在項(xiàng)目中需要臨時(shí)搭建靜態(tài)服務(wù)器,也無(wú)需安裝apache之類(lèi)的服務(wù)器,通過(guò)NPM安裝Connect之后,三行代碼即可解決需求。
這里需要提及的是在使用該模塊的一點(diǎn)性能相關(guān)的細(xì)節(jié)。

動(dòng)靜分離

前一章提及,app.use()方法在沒(méi)有指定路由信息時(shí),相當(dāng)于app.use("/", middleware)。這意味著靜態(tài)文件中間件將會(huì)在處理所有路徑的請(qǐng)求。在動(dòng)靜態(tài)請(qǐng)求混雜的場(chǎng)景下,靜態(tài)中間件會(huì)在動(dòng)態(tài)請(qǐng)求時(shí)也調(diào)用fs.stat來(lái)檢測(cè)文件系統(tǒng)是否存在靜態(tài)文件。這造成了不必要的系統(tǒng)調(diào)用,使得性能降低。
解決影響性能的方法既是動(dòng)靜分離。利用路由檢測(cè),避免不必要的系統(tǒng)調(diào)用,可以有效降低對(duì)動(dòng)態(tài)請(qǐng)求的性能影響。

app.use('/public', connect.static(__dirname + '/public'));

在大型的應(yīng)用中,動(dòng)靜分離通常無(wú)需到一個(gè)Node.js實(shí)例中進(jìn)行,CDN的方式直接在域名上將請(qǐng)求分離。小型應(yīng)用中,適當(dāng)?shù)倪M(jìn)行動(dòng)靜分離即可避免不必要的性能損耗。

緩存策略

緩存策略包含客戶(hù)端和服務(wù)端兩個(gè)部分。
客戶(hù)端的緩存,主要是利用瀏覽器對(duì)HTTP協(xié)議響應(yīng)頭中cache-controlexpires字段的支持。瀏覽器在得到明確的相應(yīng)頭后,會(huì)將文件緩存在本地,依據(jù)cache-controlexpires的值進(jìn)行相應(yīng)的過(guò)期策略。這使得重復(fù)訪問(wèn)的過(guò)程中,瀏覽器可以從本地緩存中讀取文件,而無(wú)需從網(wǎng)絡(luò)讀取文件,提升加載速度,也可以降低對(duì)服務(wù)器的壓力。
默認(rèn)情況下靜態(tài)中間件的最大緩存時(shí)設(shè)置為0,意味著它在瀏覽器關(guān)閉后就被清除。這顯然不是我們所期望的結(jié)果。除非是在開(kāi)發(fā)環(huán)境可以無(wú)視maxAge的設(shè)置外,生產(chǎn)環(huán)境請(qǐng)務(wù)必設(shè)置緩存,因?yàn)樗苡行Ч?jié)省網(wǎng)絡(luò)帶寬。

app.use('/public', connect.static(__dirname + '/public', {maxAge: 86400000})); 

maxAge選項(xiàng)的單位為毫秒。YUI3的CDN服務(wù)器設(shè)置過(guò)期時(shí)間為10年,是一個(gè)值得參考的值。
靜態(tài)文件如果在客戶(hù)端被緩存,在需要清除緩存的時(shí)候,又該如何清除呢?這里的實(shí)現(xiàn)方法較多,一種較為推薦的做法是為文件進(jìn)行md5處理。

http://some.url/some.js?md5 

當(dāng)文件內(nèi)容產(chǎn)生改變時(shí),md5值也將發(fā)生改變,瀏覽器根據(jù)URL的不同會(huì)重新獲取靜態(tài)文件。md5的方式可以避免不必要的緩存清除,也能精確清除緩存。
由于瀏覽器本身緩存容量的限制,盡管我們可能設(shè)置了10年的過(guò)期時(shí)間,但是也許兩天之后就被新的靜態(tài)文件擠出了本地緩存。這將持續(xù)引起靜態(tài)服務(wù)器的響應(yīng),也即意味著,客戶(hù)端緩存并不能完全解決降低服務(wù)器壓力的問(wèn)題。
為了解決靜態(tài)服務(wù)器重復(fù)讀取磁盤(pán)造成的壓力,這里需要引出第二個(gè)相關(guān)的中間件:staticCache

app.use(connect.staticCache());  
app.use(“/public”, connect.static(__dirname + '/public', {maxAge: 86400000})); 

這是一個(gè)提供上層緩存功能的中間件,能夠?qū)⒋疟P(pán)中的文件加載到內(nèi)存中,以提高響應(yīng)速度和提高性能。
它的官方測(cè)試數(shù)據(jù)如下:

static(): 2700 rps 
node-static: 5300 rps 
static() + staticCache(): 7500 rps 

另一個(gè)專(zhuān)門(mén)用于靜態(tài)文件托管的模塊叫node-static,其性能是Connect靜態(tài)文件中間件的效率的兩倍。但是在緩存中間件的協(xié)助下,可以彌補(bǔ)性能損失。
事實(shí)上,這個(gè)中間件在生產(chǎn)環(huán)境下并不推薦被使用,而且它將在Connect 3.0版本中被移除。但是它的實(shí)現(xiàn)中有值得玩味的地方,這有助于我們認(rèn)識(shí)Node.js模型的優(yōu)缺點(diǎn)。
staticCache中間件有兩個(gè)主要的選項(xiàng):maxObjectsmaxLength。代表的是能存儲(chǔ)多少個(gè)文件和單個(gè)文件的最大尺寸,其默認(rèn)值為128和256kb。為何會(huì)有這兩個(gè)選項(xiàng)的設(shè)定,原因在于V8有內(nèi)存限制的原因,作為緩存,如果沒(méi)有良好的過(guò)期策略,緩存將會(huì)無(wú)限增加,直到內(nèi)存溢出。設(shè)置存儲(chǔ)數(shù)量和單個(gè)文件大小后,可以有效抑制緩存區(qū)的大小。
事實(shí)上,該緩存還存在的缺陷是單機(jī)情況下,通常為了有效利用CPU,Node.js實(shí)例并不只有一個(gè),多個(gè)實(shí)例進(jìn)程之間將會(huì)存在冗余的緩存占用,這對(duì)于內(nèi)存使用而言是浪費(fèi)的。
除此之外,V8的垃圾回收機(jī)制是暫停JavaScript線程執(zhí)行,通過(guò)掃描的方式?jīng)Q定是否回收對(duì)象。如果緩存對(duì)象過(guò)大,鍵太多,則掃描的時(shí)間會(huì)增加,會(huì)引起JavaScript響應(yīng)業(yè)務(wù)邏輯的速度變慢。
但是這個(gè)模塊并非沒(méi)有存在的意義,上述提及的缺陷大多都是V8內(nèi)存限制和Node.js單線程的原因。解決該問(wèn)題的方式則變得明了。
風(fēng)險(xiǎn)轉(zhuǎn)移是Node.js中常用于解決資源不足問(wèn)題的方式,尤其是內(nèi)存方面的問(wèn)題。將緩存點(diǎn),從Node.js實(shí)例進(jìn)程中轉(zhuǎn)移到第三方成熟的緩存中去即可。這可以保證:

  1. 緩存內(nèi)容不冗余。
  2. 集中式緩存,減少不一致性的發(fā)生。
  3. 緩存的算法更優(yōu)秀以保持較高的命中率。
  4. 讓Node.js保持輕量,以解決它更擅長(zhǎng)的問(wèn)題。

Connect推薦服務(wù)器端緩存采用varnish這樣的成熟緩存代理。而筆者目前的項(xiàng)目則是通過(guò)Redis來(lái)完成后端緩存的任務(wù)。

參考內(nèi)容

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)