1. 程式人生 > >Node.js作web服務器總結

Node.js作web服務器總結

系統資源 nod 運行 分布式部署 spa https .com 數據庫 瓶頸

1、為什麽Node.js用JS開發

  首先,我們都清楚的是,同時接收數量眾多的請求是服務器非常常見的情況。而web應用程序架構(包括流量、處理器速度和內存速度)中的瓶頸在於:服務器能夠處理的並發連接的最大數量。解決這個瓶頸,有三種方法:

系統線程模型:服務端只有一個線程,並發請求(用戶)到達只能處理一個,其余的要先等待,這就是阻塞,正在享受服務的請求阻塞後面的請求了。

多線程、線程池模型:調節服務端線程的數量來提高對並發請求的接收和響應,但並發量高的時候,請求仍然需要等待。它有個更嚴重的問題,就是服務端與客戶端每建立一個連接,都要為這個連接分配一套配套的資源,主要體現為系統內存資源,以PHP為例,維護一個連接可能需要20M的內存。這就是為什麽一般並發量一大,就需要多開服務器,負載均衡等,因為他占用的資源太多。

異步、事件驅動模型:我們同樣是要發起請求,等待服務器端響應。Node。js通過更改連接到服務器的方式,讓每個連接發射(emit)一個在NodeJS引擎進程中運行的事件(Event),放進事件隊列當中,而不是為每個連接生成一個新的OS線程(並為其分配一些配套內存),基於這樣的機制,理論上陸續有用戶請求連接,NodeJS都可以進行響應,因此NodeJS能支持比Java、PHP程序更高的並發量雖然維護事件隊列也需要成本,再由於NodeJS是單線程,事件隊列越長,得到響應的時間就越長,並發量上去還是會力不從心。

2、優缺點和適用場景

優點:

1、采用事件驅動、異步編程,為網絡服務而設計。其實Javascript的匿名函數和閉包特性非常適合事件驅動、異步編程。而且JavaScript也簡單易學,很多前端設計人員可以很快上手做後端設計。

2、Node.js非阻塞模式的IO處理給Node.js帶來在相對低系統資源耗用下的高性能與出眾的負載能力,非常適合用作依賴其它IO資源的中間層服務。

3、Node.js輕量高效,可以認為是數據密集型分布式部署環境下的實時應用系統的完美解決方案。

缺點:

1. 不適合CPU密集型應用;CPU密集型應用給Node帶來的挑戰主要是:由於JavaScript單線程的原因,如果有長時間運行的計算(比如大循環),將會導致CPU時間片不能釋放,使得後續I/O無法發起;

解決方案:分解大型運算任務為多個小任務,使得運算能夠適時釋放,不阻塞I/O調用的發起;

2. 只支持單核CPU,不能充分利用CPU

3. 可靠性低,一旦代碼某個環節崩潰,整個系統都崩潰

Node非常適合如下情況:在響應客戶端之前,您預計可能有很高的流量,但所需的服務器端邏輯和處理不一定很多。

3、關於web服務器和異步IO

  我們常說的,購買阿裏雲服務器,騰訊雲服務器中“服務器”三個字是硬件的概念,也稱伺服器,是提供計算服務的設備。在網絡環境下,根據服務器提供的服務類型不同,分為文件服務器,數據庫服務器,應用程序服務器,WEB服務器等,這裏的WEB服務器主要是指與提供網站相關服務的服務器,實際上就是一臺電腦。

  對於“web服務器”,是指駐留於因特網上某種類型計算機的程序,可以向瀏覽器等Web客戶端提供文檔, 也可以放置網站文件,讓全世界瀏覽;可以放置數據文件,讓全世界下載。web服務器,是軟件的概念,實際上指的是一種程序。

我們再來看看異步IO

  首先,IO即輸入輸出(input/output),另外,阻塞IO也叫同步IO。直觀的了解阻塞IO,可以使用jQuery的ajax() 方法發送get請求,將async設置為false,url設置為http://abzzzzzzc.top,你會發現瀏覽器被鎖死了,因為沒有返回,這就是阻塞的直觀感覺。

  異步IO是計算機操作系統對輸入輸出的一種處理方式:發起IO請求的線程不等IO操作完成,就繼續執行隨後的代碼,IO結果用其他方式通知發起IO請求的程序。與異步IO相對的是更為常見的“同步(阻塞)IO”:發起IO請求的線程不從正在調用的IO操作函數返回(即被阻塞),直至IO操作完成。

參考:

百度百科:服務器,web服務器

維基百科:異步IO

https://www.cnblogs.com/hojo/p/5325352.html

https://zhidao.baidu.com/question/2268321534762262068.html

Node.js作web服務器總結