美好的一天,大家。
我想知道Node.js是否可行。假设我有两个不同的节点应用程序,它们都将竞争成为某个端口上的服务器。无论哪个到达端口,首先成为服务器,另一个自动成为该服务器的客户端。
以下是我想解释的简单图表:
因此,在此示例中,进程1成为服务器,因为它首先到达端口。流程2自动成为流程1的客户端。但是,我还希望功能如果进程1发生任何事情并且连接失败,那么进程2将成为同一端口上的新服务器。
这是我的意思的图表:
这是我到目前为止的代码:
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的新手,所以任何以正确方式指示我的帮助都会受到赞赏。
谢谢,
答案 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
尝试在端口上占主导地位的应用程序并不是一种好方法,即使您将角色从服务器切换到客户端。
最好知道一个应用程序在一个端口上运行,另一个应用程序在第二个端口上运行,这是正常的。