在我的NodeJS应用程序中,我遇到了一些关于某些任务的主要问题,因为它们需要操作大量数据,导致该进程有时被操作系统杀死,我当然希望避免这种情况。无论如何,我想减少内存消耗,因为最终客户端无论如何都是TCP连接并将所有内容存储在内存中以批量发送它是没有意义的。
架构如下:
子女的数量是预定义的,并且不会随时间而变化。目前我使用IPC在父/子之间传输数据,但内容大部分时间超过100kB,因此从我在各种堆栈中读取的内容进行IPC是没有意义的。
所以我的想法是使用一些Streams,PIPE或FIFO(只是Mac / Linux使用)来使运行顺利。但仍有一个问题是: 当多个请求进入主进程时,我该怎么办(因为master是跨子进程的负载均衡请求)?我不能只为每个孩子提供一个可以使数据重叠的流。通过Stream发送的每个缓冲区添加标识并不是真的有意义吗?
那么您在方法论和技术方面的建议是什么? (PIPEs?FIFO?还有什么?)
P.S。 :我不想给孩子一个插座。
P.S.2:如果我选择管道,那么主人每个孩子的管道是多少?
答案 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
(所有工作人员都在同一个工作人员身上)端口/服务器)您必须使用cluster
和Node 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)。