官术网_书友最值得收藏!

1.1 Node.js概述

1.1.1 使用Node.js能夠解決什么問題

Node.js的首要目標(biāo)是提供一種簡單的、用于創(chuàng)建高性能服務(wù)器及可在該服務(wù)器中運行的各種應(yīng)用程序的開發(fā)工具。首先讓我們來看一下現(xiàn)在的服務(wù)器端語言中存在著什么問題。在Java、PHP或ASP.NET等服務(wù)器端語言中,為每一個客戶端連接創(chuàng)建一個新的線程,而每個線程需要耗費大約2MB的內(nèi)存,也就是說,理論上,具有8GB內(nèi)存的服務(wù)器可以同時連接的最大用戶數(shù)為4000個左右。要讓W(xué)eb應(yīng)用程序支持更多的用戶,就需要增加服務(wù)器的數(shù)量,而Web應(yīng)用程序的硬件成本也就隨之增加了。不僅如此,在技術(shù)層面也會因此產(chǎn)生一些潛在的問題。例如,由于同一個用戶的不同客戶端請求可能會被不同的服務(wù)器處理,因此必須在所有的服務(wù)器之間共享所有的資源。由此可見,在一個Web應(yīng)用程序中,一個主要的瓶頸是服務(wù)器所支持的最大同時連接用戶量。

Node.js修改了客戶端到服務(wù)器端的連接方法,解決了這個問題。因為它并不為每個客戶端連接創(chuàng)建一個新的線程,而是為每個客戶端連接觸發(fā)一個在Node.js內(nèi)部進行處理的事件。因此,如果使用Node.js,可以同時處理多達幾萬個用戶的客戶端連接。因此,當(dāng)需要使Web應(yīng)用程序能夠支持大量用戶的并發(fā)連接的時候,我們應(yīng)該考慮使用Node.js。

1.1.2 實現(xiàn)高性能服務(wù)器

嚴格地說,Node.js是一個用于開發(fā)各種Web服務(wù)器的開發(fā)工具。在Node.js服務(wù)器中,運行的是高性能V8JavaScript腳本語言,該語言是一種可以運行在服務(wù)器端的JavaScript腳本語言。

那么,什么是V8JavaScript腳本語言呢?該語言是一種被V8JavaScript引擎所解析并執(zhí)行的腳本語言。V8JavaScript引擎是由Google公司使用C++語言開發(fā)的一種高性能JavaScript引擎,該引擎并不局限于在瀏覽器中運行。Node.js將其轉(zhuǎn)用在了服務(wù)器中,并且為其提供了許多附加的具有各種不同用途的API。例如,在一個服務(wù)器中,經(jīng)常需要處理各種二進制數(shù)據(jù)。在JavaScript腳本語言中,只具有非常有限的對二進制數(shù)據(jù)的處理能力,而Node.js所提供的Buffer類則提供了豐富的對二進制數(shù)據(jù)的處理能力。

另外,在V8JavaScript引擎內(nèi)部使用一種全新的編譯技術(shù)。這意味著開發(fā)者編寫的高端的JavaScript腳本代碼與開發(fā)者編寫的低端的C語言具有非常相近的執(zhí)行效率,這也是Node.js服務(wù)器可以提供的一個重要特性。

1.1.3 非阻塞型I/O及事件環(huán)機制

為了實現(xiàn)高性能,Node.js中采用了以下兩種機制:

·非阻塞型I/O

·事件環(huán)

JavaScript腳本語言的一個特征是它只支持單線程。V8JavaScript腳本語言也是如此,因此不需要擔(dān)心它會造成死鎖現(xiàn)象。但是與客戶端腳本語言不同的是,Node.js中為V8JavaScript腳本語言提供了非阻塞型I/O機制。例如,當(dāng)在訪問數(shù)據(jù)庫取得搜索結(jié)果的時候,在開始訪問數(shù)據(jù)庫之后、數(shù)據(jù)庫返回結(jié)果之前,存在一段等待時間。在傳統(tǒng)的單線程處理機制中,在執(zhí)行了訪問數(shù)據(jù)庫的代碼之后,整個線程都將暫停下來,等待數(shù)據(jù)庫返回查詢結(jié)果之后才能繼續(xù)執(zhí)行其后面的代碼。也就是說,I/O操作阻塞了代碼的執(zhí)行,極大地降低了程序的執(zhí)行效率。由于Node.js中采用了非阻塞型I/O機制,因此在執(zhí)行了訪問數(shù)據(jù)庫的代碼之后將立即轉(zhuǎn)而執(zhí)行其后面的代碼,把數(shù)據(jù)庫返回結(jié)果的處理代碼放在回調(diào)函數(shù)中執(zhí)行,從而提高了程序的執(zhí)行效率。

另外,在Node.js中,雖然不具有因為用戶鼠標(biāo)單擊按鈕或輸入文字等操作而觸發(fā)的事件,但是具有由于客戶端請求建立連接、通過此連接而接收客戶端提交數(shù)據(jù)、停止客戶端提交數(shù)據(jù)的接收等行為而觸發(fā)的事件。在Node.js中,在一個時刻只能執(zhí)行一個事件回調(diào)函數(shù),但是在執(zhí)行一個事件回調(diào)函數(shù)的中途可以轉(zhuǎn)而處理其他事件(包括觸發(fā)新的事件、聲明該事件的回調(diào)函數(shù)等),然后返回繼續(xù)執(zhí)行原事件回調(diào)函數(shù),這種處理機制稱為事件環(huán)機制。

1.1.4 Node.js適合開發(fā)的應(yīng)用程序

到目前為止,我們對Node.js進行了相關(guān)的概要介紹,那么,Node.js適合用來開發(fā)何種應(yīng)用程序呢?回答是:當(dāng)應(yīng)用程序需要處理大量并發(fā)的輸入/輸出,而在向客戶端發(fā)出響應(yīng)之前,應(yīng)用程序內(nèi)部并不需要進行非常復(fù)雜的處理的時候,我們應(yīng)該考慮使用Node.js來進行該應(yīng)用程序的開發(fā)。例如,我們可以開發(fā)如下應(yīng)用程序:

·聊天服務(wù)器:在一個具有很高人氣的聊天應(yīng)用程序中,在同一時刻通常可能存在著大量用戶與聊天服務(wù)器之間的并發(fā)連接,而服務(wù)器端本身并不存在非常復(fù)雜的處理。

·綜合服務(wù)類網(wǎng)站或電子商務(wù)網(wǎng)站的服務(wù)器:在這類網(wǎng)站的服務(wù)器端,往往可能在每秒鐘內(nèi)接收到多達上千條數(shù)據(jù)并且需要將這些數(shù)據(jù)書寫到數(shù)據(jù)庫中,Node.js是解決這類問題的關(guān)鍵。Node.js將通過其隊列機制將這些數(shù)據(jù)迅速書寫在緩存區(qū)中,然后再通過每一個單獨的處理從緩存區(qū)中取出這些數(shù)據(jù)并將其書寫到數(shù)據(jù)庫中。如果使用其他服務(wù)器(如Apache服務(wù)器或Tomcat服務(wù)器)的話,由于這些服務(wù)器采用的均為阻塞型I/O機制,因此需要為每條數(shù)據(jù)(到數(shù)據(jù)庫中)的寫入等待一段時間。如果使用Node.js服務(wù)器,由于其采用的是非阻塞型I/O機制,因此可以同時實現(xiàn)這些數(shù)據(jù)到數(shù)據(jù)庫中的寫入,而不必再為每條數(shù)據(jù)的寫入等待一段時間。

主站蜘蛛池模板: 林西县| 咸宁市| 波密县| 新和县| 阿荣旗| 桐乡市| 都昌县| 常宁市| 盈江县| 吴忠市| 阿拉善盟| 新乡县| 海盐县| 克什克腾旗| 太仓市| 枣庄市| 普兰店市| 延吉市| 彰武县| 丰原市| 皋兰县| 怀集县| 南平市| 海林市| 游戏| 江安县| 胶南市| 岳普湖县| 攀枝花市| 上蔡县| 忻城县| 汪清县| 贡觉县| 灯塔市| 大悟县| 碌曲县| 苏州市| 长葛市| 宜州市| 竹北市| 凌源市|