2016-03-07 86 views
0

我需要運行節點服務器以在一個盒子上開發幾個獨立的項目。NodeJS .fork()使用線程

在Nginx處於基於虛擬主機的前臺路由中,單獨運行15+個node實例通常不是什麼大問題。值得注意的是,剛開始node,很多時候只有內部庫的開銷就吃掉了我所有的RAM。

那麼是否存在這樣的解決方案,允許我在共享核心庫時運行幾個基本上獨立的節點服務器?這裏是我考慮的:

  • 線程而不是進程 - 將存在一個主控制進程,將能夠爲每個實例創建一個新的線程。我知道Node是爲了不需要線程而構建的,但是有沒有一種方法可以利用它們來節省內存?
  • 某些圖書館或節點的附加部分允許我進行上述操作。
  • 進程之間的共享內存 - 這是Node的可能嗎?
  • 只是require()在每臺服務器上的相同的節點實例 - 我想不出如何殺死或重新加載這些服務器的工作。有沒有辦法unrequire並重新啓動外部模塊?通過允許共享其他庫(例如Socket.IO),此方法可能是理想的。

無論如何,這可能是一個邊緣案例,所以我不驚訝的解決方案不明顯。

有誰知道一種方法來實現這個?

+0

我的具體環境是:我想使用Raspberry Pi來託管我爲家人創建的幾個項目。這些項目都有自己的(相當輕量級的)Node API服務器,但是Pi只是沒有內存在自己的進程中運行它們。 –

回答

0

現有的線程庫非常嚴格地限制您對I/O的訪問,並且打算讓您運行您自己的CPU綁定的Javascript代碼,而不是提供數據。共享核心是certainly possible,但也有點痛苦。我認爲你最後的選擇是最可行的。您可以很容易地爲節點組建一個虛擬化系統。

這裏有幾個獨立的Express應用程序。

APP-one.js:

var app = require('express')(); 

app.get('/', function (req, res) { 
    res.send('This is app one.'); 
}); 

app.listen(3000); 

APP-two.js:

var app = require('express')(); 

app.get('/', function (req, res) { 
    res.send('This is app two.'); 
}); 

app.listen(3001); 

改變那些通過用分配替換listen線到模塊:

app-one-virtual.js:

var app = require('express')(); 

app.get('/', function (req, res) { 
    res.send('This is app one.'); 
}); 

module.exports = app; 

APP-2-virtual.js:

var app = require('express')(); 

app.get('/', function (req, res) { 
    res.send('This is app two.'); 
}); 

module.exports = app; 

然後寫一個主應用程序,要求每個這些和代表的請求將它們基於傳入host頭:

app-master。JS:

var http = require('http'); 
var appOne = require('./app-one-virtual'); 
var appTwo = require('./app-two-virtual'); 

http.createServer(function (req, res) { 
    if (req.headers.host === 'one.example.com:3000') { 
    return appOne(req, res) 
    } 
    if (req.headers.host === 'two.example.com:3000') { 
    return appTwo(req, res) 
    } 
    res.writeHead(404) 
    res.end('Site not found.') 
}).listen(3000); 

現在只需node app-master.js和你設置。重複儘可能多的服務器,只要你喜歡。

+0

你試過這個嗎?你最終做了什麼? –