【问题标题】:Callback for Multiple AWS Lambda execution completion多个 AWS Lambda 执行完成的回调
【发布时间】:2017-07-01 20:29:37
【问题描述】:

这是我的问题:

我必须将具有某些标准的候选对象与 db 中的数百万其他候选对象进行比较。由于 lambda 只允许执行 5 分钟,因此会导致超时。

我的解决方案:

我计划与 10,000 个候选块进行比较,因此我必须调用 10 个 lambda 函数(通过 SNS)来处理 100,000 个候选块,然后将每个 lambda 的结果保存在某个 DynamoDB 表中。但是如何在所有 lambda 函数都完成处理后获得回调,以便我可以为单个 lambda 收集这些结果,然后计算最终结果。如何实现这一目标,或者有没有更好的方法来实现我的目标。非常感谢任何帮助。

【问题讨论】:

  • 与其纠结于 10 个做同样事情的 lambda 函数,何不创建一个 EC2 / Elastic Beanstalk 实例并在其中运行您的应用程序?
  • 这是客户的要求@GerritvanHuyssteen。
  • “比较”是什么意思?您是否想在众多被比较的人选中找到一个最佳人选?或者,您是否需要根据某些标准对前 X 名进行排名?
  • @JohnH 我正在做 De-Duping。删除重复的候选人并检索更准确和完整的数据。

标签: python-2.7 amazon-web-services aws-lambda amazon-sns


【解决方案1】:

我不确定 AWS Lambda 是否真的适合您的使用案例。但是,只关注问题的主要部分,您可以使用DynamoDB Atomic Counters 来确定所有处理何时完成。您将执行以下操作:

  • 最初在 DynamodB 中插入一条记录,其中 numberOfLambdaCalls 属性设置为您要启动的并发执行次数,completedLambdaCalls 属性设置为 0
  • 随着每个函数完成,作为更新 DynamoDB 记录的一部分,它们将自动增加 completedLambdaCalls 属性。
  • 每个函数都可以检查返回的更新结果,以查看它们是否是像 if numberOfLambdaCalls == completedLambdaCalls 这样完成处理的函数,如果是,则执行任何必要的操作来触发您的响应。

【讨论】:

  • 谢谢马克。你的答案几乎是正确的。它实际上使我找到了一个更准确的解决方案,即Condiditional Updatedocs.aws.amazon.com/amazondynamodb/latest/developerguide/…
  • 我想知道我的回答有什么特别不正确的地方。条件更新如何准确解决您的问题?
  • 来自 AWS 文档 However, in a banking application, it would be safer to use a conditional update rather than an atomic counter。原子计数器可以在并发更新的情况下导致错误的计数器,而条件更新允许您添加条件表达式。例如两个并发请求获得相同的计数器值,假设为 10。然后我们可以在更新时添加一个条件,即现有值应为 10。因此第一个将更新它 11,第二个将失败,重试时它将更新计数器为 12 .
  • 那是专门讨论增加银行应用程序中的帐户余额。如果您只是增加计数,那么原子计数器正是您想要的。如果您使用条件更新,那么您将有一个竞争条件,您的一些并发更新永远不会发生。
猜你喜欢
  • 2016-12-23
  • 1970-01-01
  • 2016-05-01
  • 2018-08-12
  • 2017-08-16
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
相关资源
最近更新 更多