当前位置: 首页 > 知识库问答 >
问题:

PM2能与Node.js net API一起工作吗?

聂煜
2023-03-14

我需要做一个服务器应用程序,监听几个TCP连接。这个应用程序必须是轻量级的和TCP连接将来自GPS设备(不是从浏览器,所以我不能使用WebSockets例如)。

为了确保这可以适当地扩展到数千台设备,我需要充分利用所有机器的CPU。根据我的研究,我发现了两种做这件事的方法:

  1. 创建net服务器并使用本地clusterAPI node.js提供的
  2. 创建一个应用程序,并使用PM2将其“分叉”到所有CPU上

根据我的理解,这些选项是相互排斥的。如果我选择选项1,我就不能使用PM2,反之亦然。

我的团队在任何地方都使用PM2,所以为了一致性起见,我也想使用PM2。这里的问题是PM2在Node.js套接字应用程序中存在问题。例如,我知道要使用socket.io,我们需要安装额外的模块(sticky-session),但是由于我使用的是本机API,因此没有关于我需要进行哪些调整的信息。

使用本机netAPI,我不知道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 localhost8124

  1. 在PM2中可能出现这种行为吗?如果是,如何(代码看起来像什么)?

共有1个答案

公良渝
2023-03-14

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

因此,PM2集群模式实际上使用Node.js本机API。这意味着从节点使用netcluster本机API几乎只是复制PM2已经完成的工作,除非您希望以完全不同的方式完成。

如果您的应用程序是无状态的,PM2将使用cluster功能(我将其称为使用PM2的“fork”应用程序)进行正确的伸缩。

如果不是,PM2就不能保证什么。

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

 类似资料:
  • 但是在我使用运行应用程序的服务器上,环境变量仍然。 我用来在服务器上运行应用程序的pm2命令是:

  • 我搜索了一下,我觉得这是可能的。但当我这样尝试的时候: JMockit能与Scala一起工作吗?如果可以的话,我做错了什么?

  • 根据它的Javadoc,将生成,其中的第一个值是subscribe和第一个next信号之间的经过时间。 以下测试不起作用 它将抛出异常: 我原以为经过的时间至少是1000ms,但结果只有11ms。

  • pom.xml版本信息: SpringFox-Swagger2:2.5.0 昂首阔步-核心:1.5.10 springfox-swagger-ui:2.6.1 Springboot:1.5.3 我有一个项目与swagger2和Springboot。 没有@Aspect的项目代码工作得很好。 正确的结果: 但是当我添加以下代码时,swagger-ui没有显示test-api-impl。 swagge

  • Selenium版本:2.41.0(作为Nuget包安装)OS:Windows7浏览器:Firefox浏览器版本:32

  • 为了我的研究,我在firefox中做了一些源代码修改并自己构建。为了自动化测试,我选择使用Selenium,但不幸的是,我新构建的Firefox似乎不支持Selenium。 我做了以下工作: Firefox确实会打开并且响应迅速(我可以在搜索栏中输入一个网站)。但过了一段时间,python脚本崩溃,出现以下错误消息: 我在谷歌搜索了那个错误消息,并且大多数解决方案都建议我应该更新Selenium,