【发布时间】:2018-10-10 15:49:16
【问题描述】:
背景
我需要制作一个监听多个 TCP 连接的服务器应用程序。这个应用程序必须是轻量级的,并且 TCP 连接将来自 GPS 设备(而不是来自浏览器,所以我不能使用 WebSockets)。
研究
为了确保它能够正确扩展到数千台设备,我需要充分利用所有机器的 CPU。根据我的研究,我发现了两种方法:
据我了解,这些选项是互斥的。如果我选择选项 1,我将无法使用 PM2,反之亦然。
问题
我的团队到处都在使用 PM2,所以为了保持一致性,我也想使用 PM2。这里的问题是 PM2 在 Node.js 套接字应用程序方面存在问题。例如,我知道要使用socket.io,我们需要安装额外的模块(sticky-session),但由于我使用的是本机 API,因此没有任何信息
关于我需要做的任何调整。
使用本机net API 我不知道 PM2 是否会在 CPU 之间平均分配连接,我也找不到任何信息,如果数据在时机成熟时会发送给正确的工作人员。
代码
为了证明我的目标,我使用 cluster 原生 Node.js API 制作了一个小应用程序:
const cluster = require("cluster");
const net = require("net");
const numCPUs = require("os").cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on("exit", (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
// Workers can share any TCP connection
const server = net.createServer( connection => {
console.log(`Client connected to ${process.pid}`);
connection.on( "end", () => console.log( `Client disconnected from ${process.pid}` ) );
connection.on( "data", data =>console.log(`${process.pid} received ${data.toString("ascii")}`) );
connection.on( "close", () => console.log(`Client closed connection with ${process.pid}`) );
} );
server.listen( 8124, () => console.log(`Worker ${process.pid} Bound`) );
console.log(`Worker ${process.pid} started`);
}
根据我对文档的理解,该服务器通过所有 CPU 平衡负载并重定向连接。
您可以使用 telnet 尝试此示例:telnet localhost 8124
问题
- PM2 是否可能出现这种情况?如果是的话如何(代码会是什么样子)?
【问题讨论】: