課程
/前端開(kāi)發(fā)
/Node.js
/進(jìn)擊Node.js基礎(chǔ)(一)
能夠做什么?和后端和前怎么配合使用?
2018-05-15
源自:進(jìn)擊Node.js基礎(chǔ)(一) 5-6
正在回答
有些人說(shuō)“這是一種通過(guò)javascript語(yǔ)言開(kāi)發(fā)web服務(wù)端的東西”。更直白的可以理解為:node.js有非阻se塞,事件驅(qū)動(dòng)/O等特性,從而讓高并發(fā)(high concurrency)在的輪詢和comet構(gòu)建的應(yīng)用中成為可能。
瀏覽器給網(wǎng)站發(fā)請(qǐng)求的過(guò)程一直沒(méi)怎么變過(guò)。當(dāng)瀏覽器給網(wǎng)站發(fā)了請(qǐng)求,服務(wù)器收到了請(qǐng)求,然后開(kāi)始搜尋被請(qǐng)求的資源。如果有需要,服務(wù)器還會(huì)查詢一下數(shù)據(jù)庫(kù),最后把響應(yīng)結(jié)果傳回瀏覽器。不過(guò),在傳統(tǒng)的web服務(wù)器中,比如apache服務(wù)器,每一個(gè)請(qǐng)求都會(huì)讓服務(wù)器創(chuàng)建一個(gè)新的進(jìn)程來(lái)處理這個(gè)請(qǐng)求。
后來(lái)又了ajax。有了ajax,我們就不用每次都請(qǐng)求一個(gè)完整的新頁(yè)面了,取而代之的是每次只請(qǐng)求需要的部分就可以了。這顯然是一個(gè)進(jìn)步。但是比如你要建一個(gè)FriendFeed這樣的社交網(wǎng)站(類似人人網(wǎng)那樣的刷朋友新鮮事的網(wǎng)站),你的好友會(huì)隨時(shí)的推送新的狀態(tài),然后你的新鮮事會(huì)實(shí)時(shí)自動(dòng)刷新。要達(dá)成這個(gè)需求,我們需要讓用戶一直與服務(wù)器保持一個(gè)有效鏈接。目前最簡(jiǎn)單的實(shí)現(xiàn)方法就是讓用戶和服務(wù)器之間保持長(zhǎng)輪詢(long polling)。
http請(qǐng)求不是持續(xù)的鏈接,你請(qǐng)求一次,服務(wù)器響應(yīng)一次,然后就完了。長(zhǎng)輪詢是一種利用http模擬持續(xù)連接的技巧。具體來(lái)說(shuō)或,只要頁(yè)面載入了,不管你需不需要服務(wù)器給你相應(yīng)信息,你都會(huì)給服務(wù)器發(fā)一個(gè)ajax請(qǐng)求。這個(gè)請(qǐng)求不同于一般的ajax請(qǐng)求,服務(wù)器不會(huì)直接給你返回信息,而是它要等著,直到服務(wù)器覺(jué)得該給你發(fā)信息了,它才會(huì)響應(yīng)。比如,你的好友發(fā)了一條新鮮事,服務(wù)器就會(huì)把這個(gè)新鮮事當(dāng)作響應(yīng)發(fā)給你的瀏覽器,然后你的瀏覽器就刷新頁(yè)面了。瀏覽器收到響應(yīng)刷新完之后,再發(fā)送一條新的請(qǐng)求給服務(wù)器,這個(gè)請(qǐng)求依然不會(huì)立即被響應(yīng)。于是就開(kāi)始重復(fù)以上步驟。利用這個(gè)方法,可以讓瀏覽器始終保持等待響應(yīng)的狀態(tài)。雖然以上過(guò)程依然只有非持續(xù)的http參與,但是我們模擬出了一個(gè)看似持續(xù)的連接狀態(tài)
我們?cè)倏磦鹘y(tǒng)的服務(wù)器比如apache。每次一個(gè)新用戶連到你的網(wǎng)站上,你的服務(wù)器就得開(kāi)一個(gè)連接,每個(gè)連接都需要占用一個(gè)進(jìn)程,這些進(jìn)程大部分時(shí)間都是閑著的(比如等著你的好友發(fā)新鮮事,等好友發(fā)完才給用戶響應(yīng)信息?;蛘叩戎鴶?shù)據(jù)庫(kù)返回查詢結(jié)果什么的)。雖然這些進(jìn)程閑著,但是照樣占用內(nèi)存。這意味著,如果用戶連接數(shù)的增長(zhǎng)到一定規(guī)律,你服務(wù)器沒(méi)準(zhǔn)就要耗光內(nèi)存直接癱瘓了。
這種情況怎么解決?解決的方法就是剛才上邊說(shuō)的:非阻塞和事件驅(qū)動(dòng)。這些概念在我們談的這個(gè)情景里面其實(shí)也沒(méi)那么難理解。把非阻塞的服務(wù)器想象成一個(gè)loop循環(huán),這個(gè)loop會(huì)一個(gè)跑下去。一個(gè)新請(qǐng)求來(lái)了,這個(gè)loop就接了這個(gè)請(qǐng)求,把這個(gè)請(qǐng)求傳給其他的進(jìn)程(比如傳給一個(gè)搞數(shù)據(jù)庫(kù)查詢的進(jìn)程),然后響應(yīng)一個(gè)回調(diào)(callback)。完事了這個(gè)loop繼續(xù)跑,接其他的請(qǐng)求。這樣下來(lái),服務(wù)器就不會(huì)像之前那樣傻等著數(shù)據(jù)庫(kù)返回結(jié)果了。
如果數(shù)據(jù)庫(kù)把結(jié)果返回了,loop就把結(jié)果傳回用戶的瀏覽器。接著繼續(xù)跑。在這種方式下,你的服務(wù)器的進(jìn)程就不會(huì)閑著等著了。從而在理論上說(shuō),同一時(shí)刻的數(shù)據(jù)庫(kù)查詢數(shù)量,以及用戶的請(qǐng)求數(shù)量就沒(méi)有限制了。服務(wù)器只在用戶那邊有事發(fā)生的時(shí)候才響應(yīng),這就是事件驅(qū)動(dòng)。
FriendFeed是用基于Python的非阻塞框架Tornado(知乎也用了這個(gè)框架)來(lái)實(shí)現(xiàn)上面說(shuō)的新鮮事功能的。不過(guò)nodejs就比前者更妙了。nodejs的應(yīng)用是通過(guò)javascript開(kāi)發(fā)的,然后直接在google的變態(tài)V8引擎上跑。用了nodejs,你就不用擔(dān)心擔(dān)心用戶端的請(qǐng)求會(huì)在服務(wù)器里跑了一段能夠造成阻塞的代碼了。因?yàn)閖avascript本身就是事件驅(qū)動(dòng)的腳本語(yǔ)言。你回想一下,在給前端寫javascript的時(shí)候,更多時(shí)候你都是在搞事件處理和回掉函數(shù)。javascript本身就是給事件處理量身定制的語(yǔ)言。
_Realism
舉報(bào)
本視頻教程帶你揭開(kāi)Node.js的面紗,帶你走進(jìn)一個(gè)全新世界
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2018-05-17
有些人說(shuō)“這是一種通過(guò)javascript語(yǔ)言開(kāi)發(fā)web服務(wù)端的東西”。更直白的可以理解為:node.js有非阻se塞,事件驅(qū)動(dòng)/O等特性,從而讓高并發(fā)(high concurrency)在的輪詢和comet構(gòu)建的應(yīng)用中成為可能。
瀏覽器給網(wǎng)站發(fā)請(qǐng)求的過(guò)程一直沒(méi)怎么變過(guò)。當(dāng)瀏覽器給網(wǎng)站發(fā)了請(qǐng)求,服務(wù)器收到了請(qǐng)求,然后開(kāi)始搜尋被請(qǐng)求的資源。如果有需要,服務(wù)器還會(huì)查詢一下數(shù)據(jù)庫(kù),最后把響應(yīng)結(jié)果傳回瀏覽器。不過(guò),在傳統(tǒng)的web服務(wù)器中,比如apache服務(wù)器,每一個(gè)請(qǐng)求都會(huì)讓服務(wù)器創(chuàng)建一個(gè)新的進(jìn)程來(lái)處理這個(gè)請(qǐng)求。
后來(lái)又了ajax。有了ajax,我們就不用每次都請(qǐng)求一個(gè)完整的新頁(yè)面了,取而代之的是每次只請(qǐng)求需要的部分就可以了。這顯然是一個(gè)進(jìn)步。但是比如你要建一個(gè)FriendFeed這樣的社交網(wǎng)站(類似人人網(wǎng)那樣的刷朋友新鮮事的網(wǎng)站),你的好友會(huì)隨時(shí)的推送新的狀態(tài),然后你的新鮮事會(huì)實(shí)時(shí)自動(dòng)刷新。要達(dá)成這個(gè)需求,我們需要讓用戶一直與服務(wù)器保持一個(gè)有效鏈接。目前最簡(jiǎn)單的實(shí)現(xiàn)方法就是讓用戶和服務(wù)器之間保持長(zhǎng)輪詢(long polling)。
http請(qǐng)求不是持續(xù)的鏈接,你請(qǐng)求一次,服務(wù)器響應(yīng)一次,然后就完了。長(zhǎng)輪詢是一種利用http模擬持續(xù)連接的技巧。具體來(lái)說(shuō)或,只要頁(yè)面載入了,不管你需不需要服務(wù)器給你相應(yīng)信息,你都會(huì)給服務(wù)器發(fā)一個(gè)ajax請(qǐng)求。這個(gè)請(qǐng)求不同于一般的ajax請(qǐng)求,服務(wù)器不會(huì)直接給你返回信息,而是它要等著,直到服務(wù)器覺(jué)得該給你發(fā)信息了,它才會(huì)響應(yīng)。比如,你的好友發(fā)了一條新鮮事,服務(wù)器就會(huì)把這個(gè)新鮮事當(dāng)作響應(yīng)發(fā)給你的瀏覽器,然后你的瀏覽器就刷新頁(yè)面了。瀏覽器收到響應(yīng)刷新完之后,再發(fā)送一條新的請(qǐng)求給服務(wù)器,這個(gè)請(qǐng)求依然不會(huì)立即被響應(yīng)。于是就開(kāi)始重復(fù)以上步驟。利用這個(gè)方法,可以讓瀏覽器始終保持等待響應(yīng)的狀態(tài)。雖然以上過(guò)程依然只有非持續(xù)的http參與,但是我們模擬出了一個(gè)看似持續(xù)的連接狀態(tài)
我們?cè)倏磦鹘y(tǒng)的服務(wù)器比如apache。每次一個(gè)新用戶連到你的網(wǎng)站上,你的服務(wù)器就得開(kāi)一個(gè)連接,每個(gè)連接都需要占用一個(gè)進(jìn)程,這些進(jìn)程大部分時(shí)間都是閑著的(比如等著你的好友發(fā)新鮮事,等好友發(fā)完才給用戶響應(yīng)信息?;蛘叩戎鴶?shù)據(jù)庫(kù)返回查詢結(jié)果什么的)。雖然這些進(jìn)程閑著,但是照樣占用內(nèi)存。這意味著,如果用戶連接數(shù)的增長(zhǎng)到一定規(guī)律,你服務(wù)器沒(méi)準(zhǔn)就要耗光內(nèi)存直接癱瘓了。
這種情況怎么解決?解決的方法就是剛才上邊說(shuō)的:非阻塞和事件驅(qū)動(dòng)。這些概念在我們談的這個(gè)情景里面其實(shí)也沒(méi)那么難理解。把非阻塞的服務(wù)器想象成一個(gè)loop循環(huán),這個(gè)loop會(huì)一個(gè)跑下去。一個(gè)新請(qǐng)求來(lái)了,這個(gè)loop就接了這個(gè)請(qǐng)求,把這個(gè)請(qǐng)求傳給其他的進(jìn)程(比如傳給一個(gè)搞數(shù)據(jù)庫(kù)查詢的進(jìn)程),然后響應(yīng)一個(gè)回調(diào)(callback)。完事了這個(gè)loop繼續(xù)跑,接其他的請(qǐng)求。這樣下來(lái),服務(wù)器就不會(huì)像之前那樣傻等著數(shù)據(jù)庫(kù)返回結(jié)果了。
如果數(shù)據(jù)庫(kù)把結(jié)果返回了,loop就把結(jié)果傳回用戶的瀏覽器。接著繼續(xù)跑。在這種方式下,你的服務(wù)器的進(jìn)程就不會(huì)閑著等著了。從而在理論上說(shuō),同一時(shí)刻的數(shù)據(jù)庫(kù)查詢數(shù)量,以及用戶的請(qǐng)求數(shù)量就沒(méi)有限制了。服務(wù)器只在用戶那邊有事發(fā)生的時(shí)候才響應(yīng),這就是事件驅(qū)動(dòng)。
FriendFeed是用基于Python的非阻塞框架Tornado(知乎也用了這個(gè)框架)來(lái)實(shí)現(xiàn)上面說(shuō)的新鮮事功能的。不過(guò)nodejs就比前者更妙了。nodejs的應(yīng)用是通過(guò)javascript開(kāi)發(fā)的,然后直接在google的變態(tài)V8引擎上跑。用了nodejs,你就不用擔(dān)心擔(dān)心用戶端的請(qǐng)求會(huì)在服務(wù)器里跑了一段能夠造成阻塞的代碼了。因?yàn)閖avascript本身就是事件驅(qū)動(dòng)的腳本語(yǔ)言。你回想一下,在給前端寫javascript的時(shí)候,更多時(shí)候你都是在搞事件處理和回掉函數(shù)。javascript本身就是給事件處理量身定制的語(yǔ)言。