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作为例子。 关于官方文档有更详细的信息: 集群 – 它是如何工作的
- 如何编写在Browserstack上运行量angular器/ Selenium浏览器自动化脚本的AWS Lambda脚本?
- 如何在AWS Lambda中访问标题?
- AWS Lambda函数在IntentHandler调用的函数完成之前返回
- 使用Lambda节点从S3上的文件创buildS3上的zip文件
- 在后端应用程序中使用Webpack会降低性能吗?
- Lambda函数失败,没有生成日志
- 如何在使用AWS SDK for Java调用AWS Lambda函数时检索context.done()消息?
- 使用aws iot从aws lambda发布mqtt消息到主题
- 在Facebook机器人聊天中存储用户答案的最佳方式?