2017-04-04 128 views
10

是否可以在lambda函数中使用集群模块?我试过这个:AWS上的NodeJS集群Lambda

'use strict'; 
var cluster = require('cluster'); 
var http = require('http'); 
var os  = require('os'); 

var numCPUs = os.cpus().length; 
console.log('Number of Cores : ', numCPUs); 

exports.test = (event, context, callback) => { 
    if (cluster.isMaster) { 
     for (var i = 0; i < numCPUs; ++i) { 
      cluster.fork(); 
     } 
    } else { 
     console.log('child process '); 
    } 
} 

核心数总是2,但我从来没有看到子进程日志。

更新评论例如:

我试图实现信息的模式,但我仍然没有收到孩子发来的消息。 for循环正确地循环遍历集群工作人员,但从未找到消息。

'use strict'; 
var cluster = require('cluster'); 
var http = require('http'); 
var os  = require('os'); 

var numCPUs = os.cpus().length; 
console.log('Number of Cores : ', numCPUs); 

exports.test = (event, context, callback) => { 
    if (cluster.isMaster) { 
     for (var i = 0; i < numCPUs; ++i) { 
      cluster.fork(); 
     } 
     for (const id in cluster.workers) { 
      cluster.workers[id].on('message', messageHandler); 
     } 
    } else { 
     process.send('running'); 
    } 
}; 

function messageHandler(msg) { 
    console.log(msg); 
} 
+0

您是否看到过在此方面的性能优势?你为什么要实现它? – kbariotis

+0

我正在测试性能。最后,我用一个lambda代替了一个集群。如果你有兴趣,我可以从性能测试中挖掘结果。 –

+0

绝对!谢谢 – kbariotis

回答

1

问题似乎是没有什么可以为每个子进程调用exports.test函数。 cluster.fork()使用从头开始的不同参数调用文件的新实例,与fork()系统调用C不同,后者克隆当前进程并在父进程和子进程中从同一行继续。

对于父进程,AWS lambda将调用此函数,但子进程只是定义该函数,然后等待。

我会翻转你的逻辑,以便cluster.isMaster检查发生在其他事物周围;我在本地测试了以下内容:

'use strict'; 
let cluster = require('cluster') 
let http = require('http') 
let os = require('os') 

let numCPUs = os.cpus().length 

if (cluster.isMaster) { 
    console.log('Number of Cores : ', numCPUs); 
    exports.test = (event, context, callback) => { 
    for (let i = 0; i < numCPUs; ++i) { 
     cluster.fork(); 
    } 
    for (const id in cluster.workers) { 
     cluster.workers[id].on('message', messageHandler); 
    } 
    } 
} else { 
    process.send('running'); 
} 

function messageHandler(msg) { 
    console.log(msg); 
} 

// The following used for local test 

exports.test && exports.test(); 
+0

美丽。谢谢! –

2

您的代码看起来是正确的,但你可以将这个假设,即从工人console.log()呼叫控制台为您的主进程上可见。情况并非总是如此,因为调用不会在进程树中传播。在你的if/else(存储在何处工作进程促致)你的第二个案例然后

for (var id in cluster.workers) { 
    cluster.workers[id].on('message',function() { 
    console.log('got message from ' + id + ': ' + msg); 
    }); 
} 

,:

您的通话fork()后,在折腾这个片段从子进程收到消息这对信息添加到主:

process.send('running'); 

您也可以经由发送process.send()对象(优选),我只是用一个字符串,例如,有更详细的官方文档信息:Cluster - How it works

+0

感谢您的回复。请看我更新的帖子。 –