当前位置: 首页 > 知识库问答 >
问题:

如果Lambda跟不上,DynamoDB流项目会过期吗?

壤驷阳冰
2023-03-14

我们已经配置了DynamoDB流来触发Lambda函数。超过1000万条独特记录将在30分钟内插入DynamoDB表,Lambda将在通过流触发时处理这些记录。

根据DynamoDB Streams留档,流将在24小时后过期。

问题:

这是否意味着Lambda函数(多个并发执行)应在24小时内完成对所有1000万条记录的处理?

如果某些流事件在24小时后仍未处理,它们会丢失吗?

共有1个答案

越姚石
2023-03-14

只要你不节流lambda,它就不会“跟不上”。

将发生的是,流将根据您的设置进行批处理-因此,如果您在dynamo流中同时设置5个事件,它将捆绑5个事件并将它们推向lambda。

即使这种情况每分钟发生数百次,Lambda也会(再次假设您没有故意限制Lambda执行)启动额外的并发执行来处理负载。

这是AWS的标准理念。几乎每一个无服务器资源(甚至有些没有,比如带有Elastics Beanstalk的EC2)都被设计成无缝、轻松地横向扩展以处理突发流量。

您的Lambda执行可能会在发送最后一个事件后的几分钟内完成。“24小时暂停”反对等待lambda完成/重新激活(即:您可以设置云观察事件以“持有”Dynamo Streams,直到一天中的某些时间,然后处理所有内容,例如等到下班时间让所有流处理,然后在第二天的工作时间再次关闭)

给你们一个类似的例子——我在一个lambda中通过一个SQS运行了10000次执行。它在大约15分钟内完成了10000次处决。Lambda并发旨在处理这种突发流。

然而,您的Dynamo读/写能力将受到冲击,因此请确保将其设置为至少动态且未配置。

更新

正如@Maurice在评论中指出的那样,使用Dynamo发送的并发批次有一个流限制。计算表明,即使lambda执行时间很短,它也会远远落后——lambda越长,完成的可能性就越小。

这意味着,如果您不必尽可能快地处理所有这些,您应该分配输入。

您可以在流程中的某个地方添加AWS SQS队列。很有可能,因为即使使用最大的批处理大小和超快速的流程,您也无法在插入发电机之前完成所有它们。

SQS对其最多14天的消息有限制。这可能足够做你想做的事了。如果您可以控制传入的消息,则可以将它们插入到sqs队列中,并附加等待,以便一次处理少量插入-这可以在一天内完成,也可以稍微少一点。应该是这样的

lambda to collate your inserts into an SQS queue -> SQS with a wait/smaller batch size -> Lambda to insert smaller batches into dynamo -> Dynamo Stream -> Processing Lambda

另一种选择是做一些类似的事情,但使用具有等待时间和映射的状态机。状态机有一个1年的运行时间限制,所以你有足够的时间使用它。

最后一个选项是,不是直接将数据流式传输到lambda中,而是执行lambda以立即查询发电机的较小部分以进行处理

 类似资料:
  • 这是一个正在使用AWS开发的项目。 我已经使用CloudWatch中的cron表达式安排了lambda函数。该函数将每天上传项目到DynamoDB。 尽管有一个唯一的主键,但有些项目没有上传到Dynamodb。有时跳过连续项,有时跳过主键稍相似的项。通常,跳过的项目数少于20个。 当我再次手动运行lambda函数时,它完全可以工作。想知道这背后的原因,可能的解决方案。谢谢!

  • 我有一个Lambda函数,将多个DynamoDB流配置为事件源,这是更大管道的一部分。在进行检查时,我在一个下游组件中发现了一些缺失的数据。我想编写一个更简单的Lambda函数,将其配置为前面提到的DynamoDB流之一的事件源。这将导致我的一个DynamoDB流有两个Lambda函数从中读取。我想知道这样可以吗?这两个Lamdba函数是否都能保证接收流中的所有记录,是否有任何需要注意的资源(读/

  • 假设: 让我们假设数据插入DynamoDB的速率是巨大的。 上下文: 在DynamoDB表上启用流,这将触发lambda。lambda读取流记录,并在弹性搜索中对记录进行索引。 问题陈述: 在将记录插入DynamoDB的时间和通过流式记录触发lambda的时间之间存在延迟。这种延迟或滞后不断增加,并且与插入DynamoDB的数据量成正比。 如何找到滞后的位置?是流没有立即触发lambda吗?还是因

  • 我正在使用AWS Dynamo Streams触发AWS Lambda函数。如果lambda函数成功调用,我希望通过Lambda提供的异步调用目标功能调用子lambda函数。 尽管我已使用目标子Lambda函数配置了异步调用,但当父Lambda函数成功时,不会触发子函数,子Lambda函数的关联CloudWatch日志组为空。 我的父lambda有这样的策略:(提供对DynamoDB Stream

  • 是否存在防止DynamoDB流在每次DynamoDB更改时触发λ的方法? 这些数字并不准确,但是假设step函数将连续运行10次,那么它将更新DynamoDB 3次。在step函数触发lambda之前,这是调用lambda的30倍。有什么方法可以阻止这些lambda调用吗?