当λ死亡时会发生什么?

时间:2018-12-12 19:28:42

标签: amazon-web-services aws-lambda

我是AWS的新手,因此不确定出现以下情况时的行为。

假设我有一个带有JSON数据的Kinesis流(并且假设每隔几分钟插入几千条消息)。

现在,每当将一个新的味精插入Kinesis时,就会调用一次Lambda函数,该函数会读取味精并在插入Redshift之前进行一些处理。

因此,如果出现一些错误并且Lambda函数在执行处理时崩溃,并且需要几分钟甚至几个小时(我什至不知道那是否有可能)重新出现,该怎么办。它会继续从上一条未读消息中读取Kinesis,还是从最新插入的消息中读取Kinesis(因为这是调用事件)。

谢谢。

1 个答案:

答案 0 :(得分:2)

  

Lambda函数在处理时崩溃

这是可能的。

  

并且需要几分钟甚至几个小时(我什至不知道是否有可能)才能恢复。

这不是完全可能的。

Lambda函数仅在返回响应,引发错误或触发超时计时器(以先到者为准)之前运行。永远不会几个小时。

每次调用该函数时,Lambda都会创建一个新容器,除非该容器已经为您准备好了,或者您遇到了并发限制(通常为1000 +)。

但是...对于Kinesis流,由于需要按顺序处理,所以发生的情况有些不同。

  

基于流的基于轮询(或拉模型)的事件源:这些事件源由Kinesis Data Streams或DynamoDB组成。当Lambda函数调用失败时,AWS Lambda会尝试处理错误的记录批,直到数据过期为止(最多7天)。

     

该异常被视为阻塞,并且AWS Lambda不会从分片读取任何新记录,直到失败的记录批次过期或成功处理为止。这样可以确保AWS Lambda按顺序处理流事件。

     

https://docs.aws.amazon.com/lambda/latest/dg/retries-on-errors.html

因此,您的Lambda函数引发异常或超出其超时时间只会导致Lambda服务立即破坏容器并立即创建一个新容器,然后再次使用完全相同的数据重试调用,直到数据到期(如指示)通过Kinesis配置)。

通常,延迟不超过您的超时时间或发生异常所花费的时间,外加一定数量的毫秒(对于冷启动,最长为数秒)。超时可以在Lambda函数本身上单独配置,最多可以设置15分钟(但是该最大值可能太长了)。

记住这里有些隐蔽的细节可能很重要-Lambda服务的一部分系统正在读取您的Kinesis流,然后告诉Lambda服务的另一部分来调用您的函数,其中包括记录。 Lambda服务(不是您的Lambda函数)通过​​提取数据来检查流-从技术上讲,该流不是将数据推入Lambda。 DynamoDB流和SQS的工作方式相似-Lambda提取数据,并通过重新调用该功能来处理重试。另一个服务不负责推送数据。