【问题标题】:How to cluster Node.js app in multiple machines如何在多台机器上集群 Node.js 应用程序
【发布时间】:2017-02-10 09:53:20
【问题描述】:

我使用Express jsNode-cluster 来利用集群优势我还使用PM2 进行进程和内存管理。对于单台机器,它工作正常,但我的机器有 2 个内核,我想提供更多内核。所以我决定再加入 3 台机器,现在所有 4 台机器都使用 LAN 连接。我也可以在网络浏览器中使用 IP 地址访问其他机器。

现在我想连接所有机器并希望共享它们的内核,这样我的应用程序最终将拥有 2 + 6 = 8 个内核。怎么可能?有没有可用的节点模块来实现这一点?谢谢。

【问题讨论】:

  • Arpit 那么您如何处理请求和不同进程之间的会话亲和性? .如果你有任何关于它的材料文章,你可以指出简单的集群工作,但是会话管理和请求连续性被认为是问题出现

标签: node.js express cluster-computing


【解决方案1】:

Node-cluster 可以很好地利用多核处理器,但是当涉及到水平扩展(添加更多机器)时,您需要使用负载平衡器或反向代理。对于反向代理,您可以使用任何 Web 服务器,如 Apache 或 nginx。如果你想依赖node和npm,nodejitsu有一个模块:http-proxy。这是运行您的节点应用程序的 3 台机器的 http 代理示例。

  1. 创建一个新的节点项目。
  2. 安装 http-proxy 模块。

新版本:

npm install --save http-proxy

如果您更喜欢旧版本:

npm install --save http-proxy@0.8

  1. 创建一个新的 js 文件(server.js 或任何你喜欢的文件)。

对于版本 1.x.x(新)

server.js

var http = require('http'),
httpProxy = require('http-proxy');

var addresses = [
  {
    host: "localhost",
    port: 8081
  },
  {
    host: "localhost",
    port: 8082
  },
  {
    host: "localhost",
    port: 8083
  }
];

//Create a set of proxy servers
var proxyServers = addresses.map(function (target) {
  return new httpProxy.createProxyServer({
    target: target
  });
});

var server = http.createServer(function (req, res) {
  var proxy = proxyServers.shift();

  proxy.web(req, res);

  proxyServers.push(proxy);
});

server.listen(8080);

对于版本 0.x.x(旧)

server.js

var proxyServer = require('http-proxy');

var servers = [
  {
    host: "localhost",
    port: 8081
  },
  {
    host: "localhost",
    port: 8082
  },
  {
    host: "localhost",
    port: 8083
  }
];

proxyServer.createServer(function (req, res, proxy) {
  var target = servers.shift();

  proxy.proxyRequest(req, res, target);
  servers.push(target);
}).listen(8080);
  1. 现在运行这个文件。
  2. 对 localhost:8080 的请求将被路由到 8081、8082 或 8083
  3. 您可以将 localhost 更改为您机器的 IP 地址(和端口号)。

向 8080 端口发出请求的客户端不知道 8081、8082 和 8083 存在服务器。他们向 8080 发出请求,就好像它是唯一的服务器一样,并从中获得响应。

现在,您集群中的一台机器将作为节点平衡器工作,而应用程序托管在其他三台机器上。负载均衡器的IP地址可以作为公网IP。

【讨论】:

  • 谢谢,@Sandesh_k,我有 Express js 生成的应用程序文件夹结构,其中我在 bin 文件夹中有 www 文件,它创建服务器并分配端口,所以我应该如何应用此代码www 文件?
  • 这只是一个代理服务器......它不需要成为您应用程序的一部分......只需将其部署为独立应用程序......它会在多个主机上发送您的请求...... .
  • @Sandesh_k,我应该如何通过浏览器发出请求?我在http://127.0.0.1:8080 上发出请求,它应该先去代理服务器,但 t 直接去主服务器。
  • 向您的代理服务器发出请求...它会自动将您的请求路由到其中一台主机...这意味着如果您的 http-proxy 在 8080 运行并且应用程序主机在 8081 和 8082 , 向 8080 发出请求,它会将它们路由到任何一个主机...
  • @SandeshK 感谢您的回答,如果我的一台服务器(例如端口 3002)未启动或出现错误,我如何自动将请求重定向到另一台可用服务器(即端口 3001) ?
【解决方案2】:

节点的水平缩放可以通过多种方式完成:

  1. npm 安装 http-proxy

    var proxyServer = require('http-proxy');
    var port = parseInt(process.argv[2]);
    var servers = [
      {
        host: "localhost",
        port: 8081
      },
      {
        host: "localhost",
        port: 8080
      }
    ];
    
    proxyServer.createServer(function (req, res, proxy) {
      var target = servers.shift();
    
      proxy.proxyRequest(req, res, target);
      servers.push(target);
    }).listen(port); 
    
  2. nginx

更多详情请查看以下网址 Horizontal scaling for node js

【讨论】:

    猜你喜欢
    • 2013-11-09
    • 2015-04-16
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多