减少内存使用量

时间:2016-03-17 11:07:45

标签: node.js tcp concurrency io buffer

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

架构如下:

  1. 请求到达主进程
  2. 它将它发送给它的一个或多个子进程选择(利用多个核心来处理下载大量数据等要求苛刻的请求)
  3. 儿童对待它的操作并操纵这些数据
  4. Child将一些操纵数据返回给主
  5. 主人回复了请求
  6. 子女的数量是预定义的,并且不会随时间而变化。目前我使用IPC在父/子之间传输数据,但内容大部分时间超过100kB,因此从我在各种堆栈中读取的内容进行IPC是没有意义的。

    所以我的想法是使用一些Streams,PIPE或FIFO(只是Mac / Linux使用)来使运行顺利。但仍有一个问题是: 当多个请求进入主进程时,我该怎么办(因为master是跨子进程的负载均衡请求)?我不能只为每个孩子提供一个可以使数据重叠的流。通过Stream发送的每个缓冲区添加标识并不是真的有意义吗?

    那么您在方法论和技术方面的建议是什么? (PIPEs?FIFO?还有什么?)

    P.S。 :我不想给孩子一个插座。

    P.S.2:如果我选择管道,那么主人每个孩子的管道是多少?

1 个答案:

答案 0 :(得分:0)

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

// --------------
// 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...');

});

/!\如果您打算使用sendHandle将服务器实例发送给多个工作人员,请注意,如果您想直接在工作人员中listen(所有工作人员都在同一个工作人员身上)端口/服务器)您必须使用clusterNode schedulingPolicy。如果不使用listen,即使尝试使用cluster,也不可能在同一端口上的多个工作人员<?php namespace App\Http\Controllers\Input; use App\Http\Controllers\Controller; // need Controller to extend use Illuminate\Http\Response; class InputController extends Controller { public function getInput() { return response()->view('1_input.input_form'); } }

我们构建了一个小的NPM包来管理基本上处理问题的那个(load-process-manager)。