簡體   English   中英

使用線程的NodeJS .fork()

[英]NodeJS .fork() using threads

我需要在單個盒子上運行Node服務器來開發多個獨立項目。

使用基於虛擬主機的前端路由Nginx時,運行15個以上的node實例分別工作通常不是什么大問題。 問題是,剛開始的node被很多次占用了我所有的RAM,而只是內部庫的開銷。

那么是否存在針對此問題的解決方案,允許我在共享核心庫的同時運行幾台很大程度上獨立的Node服務器? 這是我考慮過的:

  • 線程而不是進程-將存在一個主控制進程,該進程能夠為每個實例創建一個新線程。 我知道Node的構建不需要線程,但是有沒有一種方法可以利用它們來節省內存呢?
  • 一些庫或Node的新增功能允許我執行上述操作。
  • 進程之間共享核心內存-Node是否有可能?
  • 只需在每台服務器上將require ()輸入到同一Node實例上,我想不出如何殺死或重新加載這些服務器。 有沒有辦法unrequire並重新啟動外部模塊? 通過允許共享其他庫(例如Socket.IO),此方法可能是理想的。

無論如何,這可能是一個極端的情況,所以對於解決方案並不明顯我並不感到驚訝。

有人知道實現此方法的方法嗎?

現有的線程庫非常嚴格地限制了對I / O的訪問,旨在讓您運行自己的CPU綁定Javascript代碼,而不提供數據。 共享核心當然是可能的 ,但也有些痛苦。 我認為您最后的選擇是最可行的。 您可以很容易地為節點組合一個虛擬化系統。

這是幾個獨立的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-two-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 重復任意多的服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM