Подтвердить что ты не робот

Как кластеризовать приложение Node.js на нескольких машинах

Я использую Express js и Node -cluster для того, чтобы воспользоваться преимуществами кластеризации, я также использую PM2 для управления процессами и памятью. Для одной машины она работает нормально, но моя машина имеет 2 ядра, и я хочу сделать доступными больше ядер. Поэтому я решил присоединиться к еще 3 машинам, и теперь все 4 машины подключены через LAN. Я также могу получить доступ к другим машинам, используя IP-адрес в веб-браузере.

Теперь я хочу подключить все компьютеры и хочу поделиться своими ядрами, чтобы у меня наконец было 2 + 6 = 8 ядер для моего приложения. Как это возможно? Есть ли доступный модуль node для этого? Спасибо.

4b9b3361

Ответ 1

Node -cluster хорош для использования многоядерных процессоров, но когда дело доходит до горизонтального масштабирования (добавление большего количества машин), вам нужно использовать балансировщики нагрузки или обратный прокси. Для обратного прокси-сервера вы можете использовать любой веб-сервер, например Apache или nginx. Если вы хотите полагаться на node и npm, есть модуль nodejitsu: http-proxy. Ниже приведен пример HTTP-прокси для 3 машин, на которых запущено приложение node.

  • создайте новый проект node.
  • Установите модуль http-proxy.

Новая версия:

npm install --save http-proxy

Если вы предпочитаете более старую версию:

npm install --save [email protected]

  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. Вы можете изменить localhosts на IP-адреса ваших компьютеров (и номера портов).

Клиенты, делающие запрос на порт 8080, не знают о существовании серверов на 8081, 8082 и 8083. Они делают запросы к 8080, как будто это единственный сервер и получают от него ответ.

Теперь одна из машин в вашем кластере будет работать как балансир node, а приложение будет размещено на других трех машинах. IP-адрес балансира нагрузки может использоваться как открытый IP-адрес.

Ответ 2

Горизонтальное масштабирование для node может выполняться несколькими способами:

  • 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); 
    
  • nginx

для более подробной информации, пожалуйста, проверьте URL-адрес ниже Горизонтальное масштабирование для node js