Meh*_*ran 8 amazon-web-services aws-lambda
这更像是一个问题而不是一个问题,但是,有人以前经历过吗?有谁知道如何预防?
我有一个 lambda 函数(L1),它调用第二个 lambda 函数(L2),全部用 NodeJs 编写(运行时:Node.Js 8.10,aws-sdk应该是 v2.488.0 - 但我只是从文档中粘贴它)。简而言之,L1 应该调用 L2,而当它调用时,L2 会执行两次!我通过将日志写入 CloudWatch 发现了这一点,我可以看到一个 L1 日志和两个 L2 日志。
这是 L1 和 L2 的简化版本。
L1:
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();
module.exports = {
    handler: async (event, context, callback) => {
        const lambdaParams = {
            FunctionName: 'L2',
            Qualifier: `dev`,
            Payload: JSON.stringify({}),
        };
        console.log(`Calling: ${JSON.stringify(lambdaParams)}`);
        return await lambda.invoke(lambdaParams).promise();
    },
};
L2:
module.exports = {
    handler: async (event, context, callback) => {
        console.log(`L2 called`);
    },
};
在 CloudWatch 中,我可以看到一Calling ....两个L2 called!
顺便说一句,这不会一直发生。这是步骤函数过程的一部分,该过程将调用 L1 10k 次。我的代码的编写方式是,如果 L2 执行两次(每次调用),它将使整个过程失败(因为 L2 仅在记录不存在时才向 DB 插入记录,如果存在则失败)。到目前为止,我设法记录了这种行为 3 次。他们都处理相同的 10k 项,每次都在不同的迭代中面临问题。
有没有人有同样的经历?或者更好的是,知道如何确保一次调用只导致一次执行?
可能导致这种情况的一种情况是,在 L2 lambda 中,您没有返回任何内容,这将导致 L1 lambda(调用者)认为 L2 存在错误,因此触发重试机制。尝试在 L2 中返回一些内容,即使只是一个“OK”。
| 归档时间: | 
 | 
| 查看次数: | 6913 次 | 
| 最近记录: |