【问题标题】:NodeJS .fork() using threadsNodeJS .fork() 使用线程
【发布时间】:2016-03-07 19:26:21
【问题描述】:

我需要在一个机器上运行 Node 服务器以开发多个独立项目。

在基于虚拟主机的前端路由中使用 Nginx,运行 15 个以上的 node 实例单独工作通常不是什么大问题。问题是刚开始 node 时,很多时候我的所有 RAM 都被内部库的开销占用了。

那么是否存在解决方案,允许我在共享核心库的同时运行几个很大程度上独立的节点服务器?以下是我考虑过的:

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

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

有人知道实现这个的方法吗?

【问题讨论】:

  • 我的具体环境是:我想使用树莓派来托管我为家人创建的几个项目。这些项目都有自己的(相当轻量级的)Node API 服务器,但是 Pi 没有足够的内存在自己的进程中运行它们。

标签: javascript node.js multithreading shared-memory


【解决方案1】:

现有的线程库非常严格地限制了您对 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-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 就可以了。对任意数量的服务器重复此操作。

【讨论】:

  • 你试过了吗?你最后做了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 2015-05-29
  • 2011-06-23
  • 1970-01-01
  • 2017-06-21
  • 2019-05-05
  • 2020-03-13
相关资源
最近更新 更多