Node.js:竞争成为服务器的两个不同应用程序?

时间:2015-08-31 23:17:04

标签: javascript node.js process server client

美好的一天,大家。

我想知道Node.js是否可行。假设我有两个不同的节点应用程序,它们都将竞争成为某个端口上的服务器。无论哪个到达端口,首先成为服务器,另一个自动成为该服务器的客户端。

以下是我想解释的简单图表:

enter image description here

因此,在此示例中,进程1成为服务器,因为它首先到达端口。流程2自动成为流程1的客户端。但是,我还希望功能如果进程1发生任何事情并且连接失败,那么进程2将成为同一端口上的新服务器。

这是我的意思的图表:

enter image description here

这是我到目前为止的代码:

var net = require('net');

var TIMEOUT_TIME = 3000; // in milliseconds
var PORT_NUMBER = 1337;

// Attempt to create server.
var application1 = net.createServer(function (socket) {
  socket.write('Hello Server 1\r\n');
  socket.end("hello");
  console.log("Someone connected to Server 1. \n");
  socket.pipe(socket);
});

application1.listen(PORT_NUMBER, function(){
    console.log("\nServer 1 is now the official server. \n");
    setTimeout(function() {
        application1.close();
        console.log("Server 1 has been closed.");
    }, TIMEOUT_TIME);
})
.on('error', function(err) {
    console.log('there was an error.');
    if(portIsUsed(err)) {
        console.log("Port Was In Use! (This is Server 1 trying to connect.)");
        net.connect(PORT_NUMBER, function() {
            console.log("Server 1 connected to port.\n");
        });
    }
})
.on('end', function() {
    console.log("server 1 disconnected from port");
});

// Attempt to create server.
var application2 = net.createServer(function (socket) {
  socket.write('Hello Server 2\r\n');
  socket.end("hello");
  console.log("someone went into application2.");
  socket.pipe(socket);
});

application2.listen(PORT_NUMBER, function() {
    console.log("\nServer 2 is now the official server. \n");
})
.on('error', function(err) {
    if(portIsUsed(err)) {
        console.log("Port Was In Use! (This is Server 2 trying to connect.)\n");
        net.connect(PORT_NUMBER, function() {
            console.log("Server 2 connected to port.\n");
        })
        .on("end", function() {
            // code here for when the connection ends?
        });
    }
})
.on('end', function() {
    console.log("server 2 disconnected from port");
});


function portIsUsed(err) {
    return err.code === "EADDRINUSE";
}

Application2成功检测到EADDRINUSE错误(因为Application1首先连接,因此使用了端口),但在Application1丢弃的情况下如何成为新服务器?我尝试在application2中的.on("错误",...)中使用.on(" end",...),但它无效。

由于其单线程特性,这在Node.js中是否可行?在Node API中,我看到如果我有一台多核计算机,该集群用于处理多个线程。我应该使用它吗?

我是Node.js的新手,所以任何以正确方式指示我的帮助都会受到赞赏。

谢谢,

1 个答案:

答案 0 :(得分:0)

我看到你试图写两次相同的应用程序,以便能够处理它们之间的请求和平衡 那就是解决方案:

编写普通的单线程应用程序,然后使用pm2(https://github.com/Unitech/pm2)运行它:

安装

npm install pm2 -g

运行

pm2 start app.js -i max

使用keymetrics(https://keymetrics.io/):

pm2 interact public_key secret_key

尝试在端口上占主导地位的应用程序并不是一种好方法,即使您将角色从服务器切换到客户端。
最好知道一个应用程序在一个端口上运行,另一个应用程序在第二个端口上运行,这是正常的。