【问题标题】:Will PM2 work with Node.js net API?PM2 会与 Node.js 网络 API 一起使用吗?
【发布时间】:2018-10-10 15:49:16
【问题描述】:

背景

我需要制作一个监听多个 TCP 连接的服务器应用程序。这个应用程序必须是轻量级的,并且 TCP 连接将来自 GPS 设备(而不是来自浏览器,所以我不能使用 WebSockets)。

研究

为了确保它能够正确扩展到数千台设备,我需要充分利用所有机器的 CPU。根据我的研究,我发现了两种方法:

  1. 创建 net 服务器并使用 Node.js 提供的原生 cluster API
  2. 创建一个应用并使用 PM2 在所有 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

问题

  1. PM2 是否可能出现这种情况?如果是的话如何(代码会是什么样子)?

【问题讨论】:

    标签: node.js sockets tcp pm2


    【解决方案1】:

    回答

    所以,这里的答案很棘手......

    PM2 集群的工作原理

    所以,PM2 集群模式实际上使用了 Node.js 原生 API。这意味着使用 Node 的 netcluster 原生 API 几乎只是复制 PM2 已经完成的工作,除非你想以完全不同的方式来做。

    PM2 集群能否与套接字正常工作?

    如果您的应用程序是无状态,PM2 将使用cluster 功能(我称之为使用 PM2 的“fork”应用程序)正确扩展。

    如果不是,PM2 不能保证任何事情。

    http://pm2.keymetrics.io/docs/usage/cluster-mode/#statelessify-your-application

    结论

    可以,但您的应用必须是无状态的。
    您需要保存您的套接字连接以及 Redis 或 MongoDB 中的内容。

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 2013-03-22
      • 2023-03-21
      • 2014-02-26
      • 2014-08-10
      相关资源
      最近更新 更多