私は Express js と Node-cluster を使用して、クラスタリングの利点を活用しています。また、プロセスとメモリの管理にも PM2 を使用しています。単一のマシンの場合は問題なく動作しますが、私のマシンには2つのコアがあり、より多くのコアを使用できるようにしたいと考えています。そこで、さらに3台のマシンに参加することを決定し、4台すべてのマシンがLANを使用して接続されました。 WebブラウザでもIPアドレスを使って他のマシンにアクセスできます。
次に、すべてのマシンを接続し、それらのコアを共有して、アプリケーションに最終的に2 + 6 = 8のコアを持たせたいと思います。どうすれば可能ですか?これを達成するために利用可能なノードモジュールはありますか?ありがとう。
ノードクラスターはマルチコアプロセッサーを活用するのに適していますが、水平スケーリング(マシンの追加)に関しては、ロードバランサーまたはリバースプロキシを使用する必要があります。リバースプロキシについては、Apacheやnginxなどの任意のWebサーバーを使用できます。ノードとnpmに依存したい場合は、 nodejits :http-proxyによるモジュールがあります。以下は、ノードアプリを実行している3台のマシンのhttpプロキシの例です。
新しいバージョン:
npm install --save http-proxy
古いバージョンを使用する場合:
npm install --save [email protected]
バージョン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);
8080ポートへの要求を行うクライアントは、8081、8082、および8083にあるサーバーの存在を認識していません。あたかもそれが唯一のサーバーであるかのように8080に要求を行い、そこから応答を受け取ります。
これで、クラスター内のマシンの1つがノードバランサーとして機能し、アプリケーションが他の3つのマシンでホストされます。ロードバランサーのIPアドレスをパブリックIPとして使用できます。
ノードの水平スケーリングは複数の方法で行うことができます:
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を確認してください ノードjsの水平スケーリング