【问题标题】:Recursive invocations / fork invocations in AWS LambdaAWS Lambda 中的递归调用/分叉调用
【发布时间】:2016-07-06 02:33:24
【问题描述】:

我在 NodeJS 中使用 AWS Lambda。有了这个 lambda,我想在 DynamboDB 中添加一本书。它工作正常。

现在,我想做一个书籍列表。我有一些想法,但我不知道在 AWS lambda 中是否可行。

idea 1 : fork 几个lamba

我想知道是否有可能有一个“主”Lambda 有一个要添加的书籍列表,并且 foreach 书籍 调用一个 lambda 函数“插入书籍”。最大超时为 5 分钟,因此可以从“主” lambda 进行异步调用,以免等待所有分叉的 lambda 进程?

想法2:递归调用

创建一个通用 lambda,用于处理作为输入传递的书籍列表中的第一本书。在该过程结束时,从列表中删除这本书(如果可以)并使用更新的列表调用相同的 lambda。

注意:第一次调用需要获取书籍列表。

非常感谢您的帮助!

罗曼。

【问题讨论】:

  • 您没有提供很多详细信息,但从描述中我想我会做一个 Lambda 函数,它可以将书籍记录添加到您的 DynamoDB 表中,然后将该函数连接到SNS 主题并为您要添加的每本书发布到该主题的事件。

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


【解决方案1】:

我假设您进行了您没有提到的处理,这需要很长时间,以至于您无法在一次调用 lambda 函数时添加多本书。

您既可以扇出也可以递归调用您的 lambda 函数。 两者都有优点和缺点。

如果您扇出太多、太频繁,您的 dynamodb 写入可能会超过预置的写入容量。

如果您递归调用您的函数,您将无法向调用者返回值。 (假设整个调用链需要五分钟以上。)

【讨论】:

  • 感谢您的回答,我会尝试递归调用我的 Lambda 函数!
【解决方案2】:

听起来您的问题是您不拥有计算的上下文。使用“主”lambda 肯定会解决这个问题。对于如何进行调用,有几种不同的解决方案。

  1. 对于列表中的每本书,发布到“child”-lambda 订阅的 sns 主题。这是一个如何让 lambda 订阅 sns 主题 http://docs.aws.amazon.com/sns/latest/dg/sns-lambda.html 的链接。要发布到 sns 主题,您只需将 AWS SNS 开发工具包用于主 lambda 的语言。
  2. 在“主”lambda 中使用 AWS Lambda 开发工具包调用 lambda。下面显示了如何执行此操作的示例节点脚本:

const Promise = require('bluebird');
const AWS = require('aws-sdk');
const lambda = Promise.promisifyAll(new AWS.Lambda({ apiVersion: '2015-03-31' }));

const listOfBook = ['Book One', 'Book Two', 'Book Three'];

const bookEntryStats = {
    successFullBookEntries: [],
    failedBookEntries: []
};

Promise.map(listOfBooks, function (book) {

    return lambda.invokeAsync({FunctionName: 'ChildLambdaFunctionName', Payload: new Buffer(book)}).then(function () {
        bookEntryStats.successFullBookEntries.push(book);
    }).catch(function () {
        bookEntryStats.failedBookEntries.push(book);
    });
}, {concurrency: 20})
    .then(function () {
        console.log(bookEntryStats);
    });

如果使用 sns 方法,您需要考虑在发布到 sns 主题的那一刻“丢失”执行上下文时,很难控制将执行多少并发 lambda。由于您可以同时执行的并发 lambda 数量有一个硬性限制,如果书籍列表很长,您很容易导致限制。

第二种方法可能不那么优雅,但 Promise.map 函数的“并发”参数可让您控制在任何给定点执行的 lambda 函数的数量。

希望这会有所帮助!

【讨论】:

【解决方案3】:

我最近开始摆弄 AWS Lambda 并遇到了您的问题。我想通过 Web 服务调用(API 网关)启动一大批(50000)作业。这项工作需要尽快完成,这意味着开销时间加上完成一项工作所需的时间。

我有这个想法:

A.两个功能。

  • 名为 worker 的 Lambda 函数,使用有效负载数据执行工作。

  • 名为 dispatcher 的 Lambda 函数,调用自身或 worker

B.最初只有一个有效载荷。

以对象列表作为有效负载调用 Web 服务,每个对象都包含工作人员完成工作所需的数据。 Web 服务将有效负载交给第一个 dispatcher

C. Dispatcher 不返回任何内容,而是使用可轮询的 Web 服务调用来检查所有作业的状态。

举个例子。

您使用 JSON 有效负载中的 50000 个对象调用 Web 服务,Web 服务首先调用 dispatcher。当然,dispatcher 无法在不达到(AWS Lambda 的)最大执行时间的情况下按顺序遍历所有这些,因此它将传入列表拆分为 10 个新列表。这意味着接下来的 dispatchers 现在被调用了 10 次,每一次都有一个大小为 5000 的对象列表。

dispatcher 继续执行此操作,直到他们拥有如此多的小对象列表,您相信它可以开始迭代列表,为每个对象调用 worker 函数他们。

因此,如果 dispatcher 配置为仅在传入列表为 10 个或更少对象时执行作业,在此示例中,5000 个 dispatchers 将每个迭代它的列表10 个对象,调用执行工作的 worker lambda 函数。

这是我的想法,我现在正在使用它。我不确定我是否会遇到我不知道的任何 AWS 限制。我知道调用 Lambda 函数时的负载大小、最大执行时间等设置限制。

理论上,这可以无限扩展。

【讨论】:

    猜你喜欢
    • 2022-11-30
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2018-02-02
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多