node.js - AWS Lambda 上的 NodeJS 集群

标签 node.js aws-lambda

是否可以在 lambda 函数中使用 cluster 模块?我试过这个:

'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,但我从未看到子进程日志。

更新评论示例:

我尝试实现消息模式,但我仍然没有收到 children 发送的消息。 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);
}

最佳答案

问题似乎是没有什么可以调用 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();

关于node.js - AWS Lambda 上的 NodeJS 集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43213250/

相关文章:

javascript - 将for循环数据放入数组

jquery - Express 不路由某些 jQuery 请求

amazon-web-services - 为什么在尝试将 SNS 触发器添加到我的 AWS Lambda 函数时会收到错误消息?

ffmpeg - Aws lambda 使用预安装的二进制文件中的自定义 linux 命令

node.js - 在无服务器本地从另一个 Lambda 调用 lambda

node.js - 托管我自己的 Node.js Web 应用程序或使用托管服务进行部署

c# - 适用于 .NET 的 AWS 开发工具包 - IAmazonS3 不包含 'PutObject' 的定义

amazon-s3 - 如何在 Amazon S3 节点 Lambda 函数中创建文件

node.js - AWS Lambda 函数中的 XML 解析

node.js - 具有大量查询的 node-postgres