AWS Lambda上的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,但我从来没有看到subprocess日志。

更新评论示例:

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

 '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); } 

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

对于父进程,AWS lambda会调用这个函数,但是subprocess只是定义了这个函数然后等待。

我会翻转你的逻辑,以便cluster.isMaster检查发生在其他一切; 我已经在本地testing了以下内容:

 '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(); 

您的代码看起来是正确的,除非您正在假设调用console.log()从一个工作者在您的主​​进程的控制台上可见。 情况并非总是如此,因为调用不会在进程树中传播。

在你调用fork() ,抛出这个片段来接收来自subprocess的消息:

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

然后在你的第二个if / else(存储工作进程采购的地方)的例子中,把这个消息加到master:

 process.send('running'); 

你也可以通过process.send()发送对象(最好),我只是用一个string作为例子。 关于官方文档有更详细的信息: 集群 – 它是如何工作的