AWS Lambda上的NodeJS群集

Ros*_*ett 12 node.js aws-lambda

是否可以在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 ');
    }
}
Run Code Online (Sandbox Code Playgroud)

核心数始终为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);
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*min 5

问题似乎是没有任何东西可以exports.test为每个子进程调用该函数。cluster.fork()使用从头开始的不同参数调用文件的新实例,与Cfork()中的系统调用不同,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();
Run Code Online (Sandbox Code Playgroud)