2012-02-29 65 views
37

NodeJS是大型服務器端應用程序的良好框架/代碼庫嗎?我期望開發的是一個需要HTTP事務(狀態)和大量併發用戶的大型應用程序。將NodeJS用於大型項目

從我在線閱讀的內容來看,NodeJS並不是用於大型程序的最佳工具。我已經遇到如下:

  • 運行的NodeJS上的JavaScript運行在事件循環中批量使用時不是很有效。
  • NodeJS可能是非阻塞的,但是所有的請求都是在一個線程內處理的,所以當處理很多請求時,這可能會導致一些瓶頸。
  • NodeJS建立在自己的HTTP服務器之上,因此未來的維護需要自己的系統管理員/開發人員混合來管理應用程序。
  • NodeJS沒有經過充分測試和多樣化的軟件,可幫助您構建更大的應用程序。

有什麼我失蹤了嗎? NodeJS是否真的如它強大?

+0

經過一段時間的真實項目後,我用最新發現更新了我的答案。 – bryanmac 2016-07-01 12:31:14

回答

41

NodeJS是大型服務器端應用程序的良好框架/代碼庫嗎?

這個問題有點主觀,但我包括解決在大型項目中使用節點時遇到的實際問題的實際目標點。項目工作一段時間後,

更新:

它是最好的,因爲這是I/O密集型(最前端/ API服務器)的前端/ API服務器。如果您有後臺計算需求(加工等)可以配對哪些其他技術(C#網絡核心,走,爪哇等...工作節點)

我創造了這個項目作爲說明最高分的樣本 - 理智的節點發展https://github.com/bryanmacfarlane/sanenode

時的NodeJS不之上構建自己的HTTP服務器。它建立在V8 chrome javascript引擎之上,並不承擔一個http服務器。有一個內置的http模塊以及流行的express web server,但也有插座模塊(以及socket.io)。它不只是一個http服務器。

單個線程,因爲所有的I/O是事件觸發和異步不會造成瓶頸。此鏈接解釋得很好:http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

就軟件模塊而言,您可以在npm registry進行搜索。經常看很多其他人如何使用它(下載),並參觀了GitHub庫,看看是否正在主動維持它(或者是有一大堆的問題從來沒有得到注意的)。

關於「大型項目」我已經找到了穩健發展的關鍵是:

  1. 編譯時支持(和智能):查找問題,當您編譯。如果你不認爲你需要這個像我一樣,當我開始,你會首先大重構後改變了主意。

  2. 消除回調地獄:保持關鍵(如上所述)的性能,但消除回調代碼。使用async/await編寫線性代碼並保持async perf。與承諾相結合,但比單純使用承諾要好得多。

  3. 模具:選項很多,但我發現最好的是打字稿(今ES6/7),VS代碼(智能感知),摩卡(單元測試)。

  4. 儀表/記錄:通過跟蹤和檢測來獲取對應用的洞察力至關重要。

  5. 建立在良好的審查框架:我使用快遞爲例,但這是一個偏好,還有其他人。

+4

這都是非常好的一點,但問題是:* NodeJS是一個很好的框架/代碼庫,適用於大型服務器端應用程序* *。這並沒有回答這個問題。 – Maroshii 2013-04-05 20:38:23

+2

@Maroshii - 這是一個相當主觀和含糊的問題 - 我建議基於這個問題關閉。但是,爲什麼它可能是不可接受的,我列舉了具體的幾點,並且我闡述了這些觀點。 – bryanmac 2014-07-25 22:36:49

+0

//是否正在積極維護(或者是否有一堆問題從未受到關注)。 這部分真的很嚇人:/,如果該工具的支持將來停止,會發生什麼情況:/ – AVI 2017-08-07 12:42:26

15

Node.js是構建分佈式網絡服務的非常好的工具。什麼是你的大型應用程序設計不僅僅是一個'使用哪個工具'的問題。很多人使用node.js以非常不同的方式與ruby,php,erlang,apache & nginx & HAproxy。如果你不知道你爲什麼需要節點,你可能不需要它。可能的原因考慮節點:

  • 你想分享
  • 你期望高的併發負載(幾千到每臺服務器成千上萬的併發連接)
  • 你(或你的團隊的服務器和客戶端之間的共同Javascript代碼)是多與任何其他可用的語言/框架
  • 如果one of 7600+ modules正在執行的所需的功能大部分更精通用JavaScript
+3

+1 - 特別是最新的服務器和客戶端代碼。在瀏覽器客戶端和服務器之間共享JavaScript庫(如驗證)(REST API等)非常有吸引力。 – bryanmac 2012-02-29 12:03:17

+0

同意@bryanmac。還爲單頁應用共享html模板非常棒。 – Maroshii 2013-04-05 20:44:07

8

真的是的NodeJS以自己的方式,有的更多信息強大,

  1. 您可以在負載均衡運行應用程序的多個實例來處理大量的請求。
  2. 選擇NodeJs讀取2000個文件,而不是計算20個質數。
  3. 將NodeJs忙於讀取/寫入文件或端口。
  4. 當您需要向多個客戶端廣播您的響應時非常有用。
  5. 不關心NodeJs中的死鎖,而是關心你做同樣操作的頻率。
  6. 最重要的是,直到進程終止,這些值才生活在V8引擎中。確保你要在NodeJs中輸入多少行代碼。
2

我發現最重要的是儘量少用CPU時間。如果您的應用程序需要密集使用CPU,則事件循環延遲會增加,並且應用程序無法響應任何其他請求。

9

NodeJS的一個「問題」是構建大型應用程序需要開發人員/團隊的紀律。

對於同一家公司內的多個團隊尤其如此。現有的框架有點鬆散,不同的團隊會想出解決問題的不同方法。

KrakenJS是一個構建於express之上的框架。它增加了一層約定和配置,使其可以輕鬆(呃)構建包含多個團隊的大型項目。