為什麼用Node.js?

Jiasen發表於2018-07-03

今天阿里的考官問了我個問題,為什麼選Node.js作為後臺主要的開發語言。

我:我們的業務都不復雜,Node.js比較簡單,我們都喜歡用Node.js,我們用微服務架構哇,好部署呀。

考官:emmm~,為毛不說點Node.js的優缺點?你以為我真關心你為什麼選Node.js麼?(我猜他心裡這麼想的)

有什麼特點?

以下都是憑記憶想的,有不對的私信我,我偷偷改。

單程式,非同步I/O,事件驅動。這是Node.js最主要的特點。

單程式的優點是不需要像多程式那有互相協調資源,能夠節省伺服器的開銷。缺點是單個執行緒性的計算能力有限,不能發揮出多核計算機的計算優勢。而且一旦出現問題,整個服務將不可用。

目前的應用伺服器的制約效能的瓶頸一般是I/O上,也就是讀寫磁碟。Node.js將所有與I/0相關的操作都做成非同步執行的方式,這樣主程式現在只要專心處理一些與I/O無關的邏輯處理。因為沒有I/O的效能限制,所以能很快的處理來自客戶端的請求,提高服務的併發量。

總結一下Node.js的特點,

優點:

  • 單程式,節約資源
  • 非同步I/O,提升併發量
  • 語言靈活,別人能寫的,JavaScript也要能寫。

缺點:

  • 可靠性相對較低,一旦出現未捕獲的異常將直接導致服務不可用
  • 單執行緒計算能力有限,不能很好的利用多核
  • 語言靈活,怎麼寫的都有。

適合做什麼?

根據優點簡單推測,Node.js適合做一些高併發的,I/O密集型的應用。

根據缺點簡單推測,Node.js不適合做一些計算密集型的應用。

實際的團隊配置?

近年其他的開發語言,例如Java、PHP、.NET也都有了非同步I/O的處理機制,而Node.js也推出cluster模組來處理多程式的問題,還有V8也一直的在持續優化。

語言的特性並不是一成不變的,語言之間都在相互學習(或者叫抄襲,手動滑稽),所以在我看來其實並不是說有什麼應用非什麼語言不行。至少說不能用舊有的觀念主導我們現在的選擇。

比方說,現在的Node.js真的不適合做計算密集型應用麼?答案是否定的,可以看一篇IBM的部落格淺析 Node.js 在 CPU 密集型問題上應用

文章中使用了一些常見的演算法來測試Node.js計算效能,實際發現在很多計算場景中Node.js的計算效能都不差,甚至還比我們通常意義上認為的比較快的C還快些。

文章最後的結論::Node.js 在整體都有不錯的表現,即使在某些方面表現不佳,在充分考慮到時間空間複雜度的情況下,可以使用 Addons 特性通過 C/C++擴充套件來大幅度提高效能。而事實證明,的確得到極大的改善,因此我們有理由相信,Node.js 是能夠勝任 CPU 密集型任務的

還在沉浸在幾年前說Node.js不適合計算密集型的老舊印象中麼?(啪啪打自己臉)

So,除了語言本身的基本特性,什麼才是我們在技術選型中真正考慮的呢?

  • 團隊成員整體的技術棧更偏向哪種?
  • 能不能滿足大部分的需求?
  • 新招的小夥伴哪種更容易上手?
  • 哪種更好招人?(初創公司更重要?)
  • 容器化、微服務這些新東西,哪個更好做、更適合做?(我現在也不清楚)
  • ...

老大的愛好?

老大:Jason,這個專案你覺得用什麼做好些?

我:這個複雜、多計算、I/O¥%#%@……#%&!#!

老大:說那麼多幹什麼,我喜歡Node.js。

我:那用Node.js吧。

以上純屬杜撰瞎扯。希望老大沒有發現我在編排他

相關文章