Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 减少内存使用_Node.js_Tcp_Concurrency_Io_Buffer - Fatal编程技术网

Node.js 减少内存使用

Node.js 减少内存使用,node.js,tcp,concurrency,io,buffer,Node.js,Tcp,Concurrency,Io,Buffer,在我的NodeJS应用程序中,我面临一些任务的一个主要问题,因为它们需要处理大量数据,这会导致进程有时被操作系统终止,当然我希望避免这种情况。无论如何,我想减少内存消耗,因为终端客户机无论如何都是TCP连接的,将所有内容存储在内存中以批量发送是没有意义的 架构如下所示: 请求到达主进程 它将其发送到它选择的一个或多个子进程(利用多个内核来满足要求的请求,如下载大量数据) Child处理它的操作并处理这些数据 Child将一些经过处理的数据返回给master 主人对请求作出答复 子对象的数量是预定

在我的NodeJS应用程序中,我面临一些任务的一个主要问题,因为它们需要处理大量数据,这会导致进程有时被操作系统终止,当然我希望避免这种情况。无论如何,我想减少内存消耗,因为终端客户机无论如何都是TCP连接的,将所有内容存储在内存中以批量发送是没有意义的

架构如下所示:

  • 请求到达主进程
  • 它将其发送到它选择的一个或多个子进程(利用多个内核来满足要求的请求,如下载大量数据)
  • Child处理它的操作并处理这些数据
  • Child将一些经过处理的数据返回给master
  • 主人对请求作出答复
  • 子对象的数量是预定义的,不会随时间变化。目前,我正在使用IPC在父级/子级之间传输数据,但内容大部分时间都超过100kB,因此从不同堆栈中读取的内容进行IPC是没有意义的

    所以我想,应该使用一些流、管道或FIFO(仅限于Mac/Linux使用)来使其平稳运行。但还有一个问题是: 当多个请求进入主进程(因为主进程是跨子进程的负载平衡请求)时,我该怎么办?我不能每个孩子只有一个流,这可能会造成数据重叠。我想,向通过流发送的每个缓冲区添加标识也没有什么意义

    那么,在方法论和技术方面,你有什么建议?(管道?先进先出?其他什么?)

    我不想把插座给孩子


    p.S.2:如果我使用管道,那么主管道如何能为每个孩子提供单独的管道?

    您应该直接将到达父管道的插座发送给孩子。一旦孩子有了套接字连接,它就可以接收数据,并且不再使用父母和孩子之间的IPC通信(避免开销)。要实现这一点,您应该使用
    worker.process.send([data…],sendHandle)
    这非常重要,您可以理解这一点

    /!\如果您打算使用
    sendhold
    将服务器实例发送给多个工作进程,请注意,如果您想让
    直接侦听工作进程(所有工作进程都在同一端口/服务器上),则必须使用
    集群和。如果不使用
    集群,就不可能在同一端口上的多个工作进程中
    侦听

    我们构建了一个小的NPM包来管理这个()包,它基本上解决了这个问题

    // --------------
    // parent.js
    // --------------
    
    // Load the net module to create a tcp server.
    var net = require('net');
    var child = require('child_process').fork('child.js');
    
    // Creates a new TCP server. The handler argument is automatically set as a listener for the 'connection' event
    var server = net.createServer(function (socket) {
    
      // You should add logic to be sure not sending a socket to a child that isn't alive yet..
      child.send({new:'socket connection'}, socket);
    
    });
    
    
    // --------------
    // child.js
    // --------------
    process.on('message', function (message, socket) {
    
      socket.on('data', function (d) {
        // Consume your data here
      });
    
      socket.write('write to client if you want...');
    
    });