NodeJS .fork()使用线程

时间:2016-03-07 19:26:21

标签: javascript node.js multithreading shared-memory

我需要在一个盒子上运行Node服务器来开发几个独立的项目。

在基于虚拟主机的前端路由中使用Nginx,运行单独工作的15 + node个实例通常不是很大的问题。问题在于,只需要开始node就可以多次使用内部库的开销来占用我的所有内存。

那么是否存在这样的解决方案,允许我在共享核心库的同时运行几个基本上独立的Node服务器?以下是我所考虑的内容:

  • 线程而不是进程 - 将存在一个主控制进程,可以为每个实例创建一个新线程。我知道Node的构建不需要线程,但有没有办法利用它们来节省内存?
  • 某些库或添加到Node允许我执行上述操作。
  • 进程之间的共享核心内存 - 这是Node的可能性吗?
  • 只需require ()将每个服务器放到同一个节点实例上 - 我无法想到如何杀死或重新加载这些服务器。有没有办法unrequire并重新启动外部模块?通过允许共享其他库(例如Socket.IO),这种方法可能是理想的。

无论如何,这可能是一个边缘情况,所以我并不感到惊讶,解决方案并不明显。

有谁知道实现这个的方法?

1 个答案:

答案 0 :(得分:0)

现有的线程库会严重限制您对I / O的访问,并且您可以运行自己的CPU绑定Javascript代码,而不是提供数据。共享核心是certainly possible,但也有点痛苦。我认为你最后的选择是最可行的。您可以非常轻松地为节点组建虚拟化系统。

以下是一些独立的Express应用程序。

应用-one.js:

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

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

app.listen(3000);

应用-two.js:

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

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

app.listen(3001);

通过将listen行替换为模块的赋值来更改它们:

应用酮virtual.js:

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

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

module.exports = app;

应用-两virtual.js:

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

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

module.exports = app;

然后编写一个主应用程序,该应用程序需要每个应用程序并根据传入的host标头向它们委派请求:

应用-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即可。根据需要重复多个服务器。