aws-sdk调用不在AWS Lambda上运行的分叉node.js进程中工作

时间:2018-04-07 15:40:06

标签: node.js amazon-web-services aws-lambda aws-sdk

我有一个小节点模块调用fork系统调用来分叉正在运行的进程。当我尝试从子进程调用aws-sdk函数Kinesis.putRecord时,调用不会发生。从父进程调用工作正常。

为了说明这一点,以下两个代码片段仅对父进程或子进程是否执行对putRecord的调用有所不同。

在第一个代码段中,调用由父进程执行,调用正常。

const aws = require('aws-sdk');
const fork = require('fork');

module.exports.handler = (event, context, callback) => { 
    const isChild = fork.fork();
    if (!isChild) { // Parent
        const kinesis = new aws.Kinesis()
        const record = {
          Data: "Lorem ipsum",
          PartitionKey: "123456",
          StreamName: process.env.STREAM_NAME,
        }
        kinesis.putRecord(record, (err, data) => {
            if (err) {
                callback(null, {message: 'Encountered error in kinesis', err});
            } else {
                callback(null, {message: 'Successfully ran in kinesis', data});
                fork.wait();
            }
        })
    } else { // Child
        process.exit();
    }
};

另一方面,在第二个代码片段中,子进程执行调用,并且不执行调用。特别是在此示例中,Lambda执行超时。

const aws = require('aws-sdk');
const fork = require('fork');

module.exports.handler = (event, context, callback) => {  
    const isChild = fork.fork();   
    if (isChild) { // Child      
        const kinesis = new aws.Kinesis()
        const record = {
          Data: "Lorem ipsum",
          PartitionKey: "123456",
          StreamName: process.env.STREAM_NAME,
        }
        kinesis.putRecord(record, (err, data) => {
            if (err) {
                callback(null, {message: 'Encountered error in kinesis', err});
            } else {
                callback(null, {message: 'Successfully ran in kinesis', data});
            }
        })
    } else { // Parent
        fork.wait();
    }
};

可以找到fork模块here

我正在使用node.js版本6.10.3。

1 个答案:

答案 0 :(得分:0)

Node.js基于单线程架构。 AWS Lambdas经过精心设计和优化,可执行相对短期的功能。您的lambda最有可能只在运行时分配一个虚拟CPU。

你试图通过并行运行两个lambdas无法解决的问题解决了什么问题?有many ways of triggering lambdas因此不会太难。甚至还有calling one lambda from another asynchronously的概念。