2016-03-01 61 views
6

使用Node.js服務器,我想知道是否可以並推薦從委託工作進程,而不是主進程。這些工作進程可以是Node.js服務器本身,也可以是通過IPC進行通信的Node.js子進程。「使用Node.js進行直接響應」 - 使用不同的Node.js進程發送HTTP響應(與主進程不同)

我不認爲集羣核心模塊https://nodejs.org/api/cluster.html可以做我想做的事情,因爲在該模型中,所有工作人員都在同一個端口上偵聽,並且他們代表主進程處理所有請求。我在尋找的是一個主要的Node.js進程,它響應所有HTTP請求,可能執行身份驗證並處理一些請求,但也能夠將數據密集型或CPU密集型請求委派給工作池。

想象一下,我們有大量數據的GET請求,比如2-3MBs。

我們具有至少3分可能的情況:

  1. 主進程接收請求,要求輸入大量數據的數據庫,然後將數據發送回給請求者。
  2. 主進程接收到請求,使用IPC向工作進程發送一些數據,工作人員從數據庫獲取數據進行一些繁重的操作,然後工作人員使用IPC將所有3MB數據發送回主過程,然後發送迴應。
  3. 主進程接收請求,向工作人員發送儘可能少量關於請求流的信息,工作人員完成所有工作,工作人員發回HTTP響應。

我對製作#3可能特別好奇。

方案3的簡單描述低於:

enter image description here

(只是要清楚,我不想對一個請求3個迴應,我只是想表明,工人也可能代表主流程發送響應)。

任何人都知道這可能與Node.js一起工作?它如何在其他語言中起作用?通常,我對Node.js併發模型沒有任何問題,但對於某些類型的數據,使用Cluster模塊可能不是實現最高併發水平的最佳方式。

我相信這個模型的一個術語是「直接響應」,意思是工作人員直接響應請求。也許可以簡單地爲此使用羣集核心模塊https://nodejs.org/api/cluster.html

+0

不久前我有點類似的想法,但經過大量的搜索後,我最終使用nginx作爲負載平衡器,看起來像你想要實現的,但沒有旋轉整個應用程序。如果有人有任何問題,我也有興趣瞭解解決方案。 – shriek

+0

當然,謝謝,我認爲cluster.setupMaster可能能夠做我想做的事,但我還不確定,請參閱:https://nodejs.org/api/cluster.html#cluster_cluster_setupmaster_settings –

+1

例如,請參閱接受答案在這裏:http://stackoverflow.com/questions/23771516/using-cluster-in-a-node-module/24463511#comment59142347_24463511 –

回答

0

我想知道是否有可能也建議發送從委託工作進程的HTTP響應

是的,這是可能的,可能向外擴展應用程序服務器的最簡單最常用的方法。與IPC不同,它可以通過網絡跨主機工作。 (如果你需要,它也可以在本地工作......但是確保你的應用程序實際上是CPU綁定的。儘管JavaScript本身是單線程的,但是大多數IO和一些NPM模塊的庫都使用線程池。 )

沒有理由使用節點。js作爲後端服務器之間的服務器負載平衡。 Node.js更適合您的應用程序服務器。對於只是代理HTTP請求的東西,我會使用Nginx或類似的。 Nginx可以高效地處理與客戶端的所有交易,並且可以輕鬆配置以實現負載平衡。

0

如果你想利用你的機器(或多個)多處理器(本身執行節點只使用一個單一的過程),只需使用PM2:

https://www.npmjs.com/package/pm2

PM2開始的各種情況下的應用程序在您指定給PM2的處理器上。如果你的應用程序是無狀態的(因爲它理想地使用Node),你的應用程序的一個實例將運行在每個處理器上,PM2將執行路由。

如果我可以口頭重新繪製針對場景3發佈的圖表,PM2將代替「MAIN」,「W」將替換爲您的應用,無需擔心工作人員和分叉。

我們在生產中使用PM2,它對我們來說效果很好。