[TOC]
# Node.js的弊端
### 單線程帶來的弊端
Node.js中有一個特點就是單線程,它帶來了很多好處,但是它也有弊端,單線程弱點如下。
1. 無法利用多核 CPU
2. 錯誤會引起整個應用退出無法繼續調用異步`I/O`
3. 大量計算占用 CPU 導致無法繼續調用異步`I/O`
以上確實是 Node 的弊端,但是都會有一些對應的解決方案:
弊端1:解決方案
* (1)一些管理工具比如`pm2,forever` 等都可以實現創建多進程解決多核 CUP 的利用率問題。
* (2)在 v0.8 版本之前,實現多進程可以使用 `child_process`
* (3)在 v0.8 版本之后,可以使用`cluster` 模塊,通過主從模式,創建多個工作進程解決多核CPU的利用率問題。
弊端2:解決方案
* (1)Nnigx 反向代理,負載均衡,開多個進程,綁定多個端口;
* (2) 一些管理工具比如`pm2,forever`等都可以實現進程監控,錯誤自動重啟等
* (3)開多個進程監聽同一個端口,使用Node提供的`cluster`模塊;
* (4)未出現`cluster`之前,也可以使用`child_process`,創建多子線程監聽一個端口。
* (5)這里說明下,有上面的這些解決方案,但是寫node后端代碼的時候,異常拋出`try catch`顯得格外有必要。
弊端3:解決方案
* (1)可以把大量的密集計算像上面一樣拆分成多個子線程計算
* 但是如果不允許拆分,想計算100萬的大數據,在一個單線程中,Node確實顯得無能為力,這本身就是V8內存限制的弊端。
> 說明:`child_process`與`cluster`模塊我會單獨拿一篇文章來講。 值得開心的是上面這些弊端隨著Node 的版本更新,和新的 api 模塊出現,好像解決了這些弊端。
# Node.js的應用場景
介紹了Node.js的特點和弊端,再說一下Node.js的應用場景。
Node.js適合用來開發什么樣的應用程序呢?
善于`I/O`,不善于計算。因為`Node.js`最擅長的就是任務調度,如果你的業務有很多的`CPU`計算,實際上也相當于這個計算阻塞了這個單線程,就不太適合Node開發,但是也不是沒有解決方案,只是說不太適合。
當應用程序需要處理大量并發的`I/O`,而在向客戶端發出響應之前,應用程序內部并不需要進行非常復雜的處理的時候,`Node.js`非常適合。`Node.js`也非常適合與`websocket`配合,開發長連接的實時交互應用程序。
具體場景可以表現為如下:
* 第一大類:用戶表單收集系統、后臺管理系統、實時交互系統、考試系統、聯網軟件、高并發量的web應用程序;
* 第二大類:基于web、canvas等多人聯網游戲;
* 第三大類:基于web的多人實時聊天客戶端、聊天室、圖文直播;
比如聊天服務,聊天應用程序是最能體現 Node.js 優點的例子:輕量級、高流量并且能良好的應對跨平臺設備上運行密集型數據(雖然計算能力低)。同時,聊天也是一個非常值得學習的用例,因為它很簡單,并且涵蓋了目前為止一個典型的 Node.js 會用到的大部分解決方案。
* 第四大類:單頁面瀏覽器應用程序;
* 第五大類:操作數據庫、為前端和移動端提供基于`json`的 RESTful API;
這是適合 Node 的理想情況,因為您可以構建它來處理數萬條連接。它仍然不需要大量邏輯;它本質上只是從某個數據庫中查找一些值并將它們組成一個響應。由于響應是少量文本,入站請求也是少量的文本,因此流量不高,一臺機器甚至也可以處理最繁忙的公司的 API 需求。
* 第六大類,....
# 哪些大公司在用
* 雅虎:雅虎開放了 `Cooktail`框架,將 `YUI3`這個前端框架的能力借助Node延伸到了服務器端。
* 騰訊:將Node應用到長連接,以提供實時功能。
* 花瓣網,蘑菇街:通過 `socket.io` 實現實時通知。
* 阿里:主要利用的是并行 `I/O` 這個性能,實現高效的分布式,它們自己也出了很多Node框架
* LinkedIn:移動網站也是使用的 Node
* 網易:游戲領域對并發和實時要求很高,網易開源了 Node 的實時框架 `pomelo`
* 等等...