繁体   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