Lambda 超时,无法处理来自 DynamoDB 的所有结果。除了迁移到 Fargate 之外,还有什么优化的技巧吗?



Lambda需要从DynamoDB获得所有结果,并执行对每个记录的处理,并触发一个阶跃函数工作流。虽然分页结果是由DynamoDB给出的,但如果有太多的页面无法在Lambda限制的15分钟内处理,Lambda将超时。是否有任何解决方法来使用lambda,而不是移动到法盖特?

Lambda概述

while True: 
l, nextToken = get list of records from DynamoDB
for each record in l:
perform some preprocesing like reading a file and triggering a workflow
if nextToken == None:
break

我假设处理一条记录可以符合15分钟的lambda限制。

你能做的就是让你的原始lambda成为一个编排器,它调用一个处理单个页面的workerlambda。

  • 协调器λ

    while True: 
    l, nextToken = get list of records from DynamoDB
    for each record in l:
    call the worker lambda by passing the record as the event
    if nextToken == None:
    break
    
  • 工人λ

    perform some preprocesing like reading a file and triggering a workflow
    

您可以使用SQS为您提供一种快速连续处理这些数据的方法。您甚至可以使用它来或多或少地并行执行它们,而不是同步。

Lambda reads in Dynamodb -> breaks each entry into a json object -> sends the json object to SQS -> which queues them out to multiple invoked lambda -> that lambda is designed to handle one single entry end finish

这样做允许您通过设计第二个lambda只处理任务的一次迭代并使用SQS作为循环/迭代器来拆分可能需要多个lambda调用许多小时的长任务。您可以在SQS上设置设置为尽可能快地发送或一次发送一条消息(尽管如果您一次发送一条消息,您将不得不管理队列中消息的存活时间和过期设置)

此外,如果这是一个常规的事情,新的项目被添加到发电机,然后必须处理,你应该利用发电机流-每次一个新的项目被添加,触发一个lambda在新项目上触发,允许做你的工作流在实时项目被添加。

最新更新