2013-07-30 39 views
5

所以我開始爲我正在做的項目使用node.js。cpu密集任務的子進程?

當客戶端發出請求時,我的node.js服務器從另一個服務器獲取一個json,然後將其重新格式化爲一個新的json,並將其提供給此客戶端。但是,節點服務器從其他服務器獲得的json可能非常大,因此對數據的「按摩」相當密集。

我一直在閱讀過去幾個小時node.js是不是偉大的CPU任務和我見過的主要反應是產卵子進程(基本上是一個.js文件運行通過不同的節點實例),它處理可能會阻塞主事件循環的任何cpu密集型任務。

假設我有20,000個併發用戶,那意味着它會產生20,000個OS級別的作業,因爲它正在運行這些子進程。

這聽起來像個好主意嗎? (一個不同的web服務器只會在同一個進程上創建20,000個線程。)

我不確定我是否應該運行子進程。但我確實需要做一個非阻塞的cpu密集型任務。我應該做什麼的想法?

回答

-2

那些說不知道如何構建解決方案的人。

NodeJS正是它所說的,它是一個節點,應該像這樣對待。

在你的例子中,你的節點實例連接到一個外部api並抓取json來處理和發回。

即 1.使用// server.com/getJSON 2.處理JSON 3.後// server.com/postJSON

那麼你會怎麼做? 問自己是時間問題了嗎?如果是這樣,那麼節點不是解決方案 但是,如果你對原始處理能力更感興趣,而不是4秒內完成的一個請求

您有興趣的是200秒內完成的請求,但每個人都需要約滿10秒。

診斷您的JSON需要多長時間才能按摩,如果小於1秒。 只需運行4個節點實例,而不是1.

但是,如果它比這更復雜,請將json分成要處理的段。並使用異步回調處理每個段

process.nextTick(函數(doprocess(SEGMENT1); process.nextTick(函數(){doprocess(分段2)

每個doProcess調用下doProcess

節點JS將交易請求之間的時間。

現在採取這一解決方案,它的規模太大每個服務器4分節點的情況下,2-5服務器

,突然你有一個非常可擴展性和成本效益的搜索解決方案ñ。

+0

segmentize一個json文件,每個服務器創建4個節點實例,2-5個服務器?現在我有一個非常可擴展且經濟高效的解決方案? gee whiz。 – foreyez

+0

比它看起來更簡單。 2-5臺服務器的吞吐量很大。多年以來,你從哪裏來。 NodeJS的構建是爲了像系統中的節點一樣使用,它是完成任何你想做的事情所需的最低限度。這不是一種預先設定的可伸縮性解決方案,但是您可以使用它構建一個非常好的系統。 – miketheprogrammer

8

Power Node的V8 Javascript引擎實際上是pretty fast comparedto manyserver-side languages

問題是Node的Evented Model與cooperative multitasking非常相似 - 一個特定的請求操作將繼續進行,直到它將控制權交還給Javascript事件循環爲止,因此高CPU任務將阻止循環(意味着隨機選擇用戶將獲得完美的性能,而另一個組將獲得超時,而不是性能隨着負載的降級而降級)。

因此,對於CPU密集型任務,有幾種解決方案,你可以使用:

  1. 你可以把你的代碼像處理流水線,加工顯著塊之間根本process.nextTick降低平均延遲(同時增加絕對最小值),基本上更「合作」,並且不會讓任何一個請求長時間佔用CPU。
  2. 如果您的工作是純Javascript(無需使用節點模塊),則可以使用node-webworker-threads庫將CPU密集型工作轉移到線程。然而,不斷產生新線程可能是一個糟糕的主意,所以你可能需要一個線程池,你排隊工作,以便這些工作者從中拉出並返回到輸出隊列。在這種情況下...
  3. 您創建了一個子進程工作者池並使用相同的排隊機制,其中池大小取決於需要CPU密集路徑的請求的百分比,請求的總數以及可容忍的這些請求允許延遲增加。