我是AWS的新手,因此不确定出现以下情况时的行为。
假设我有一个带有JSON数据的Kinesis流(并且假设每隔几分钟插入几千条消息)。
现在,每当将一个新的味精插入Kinesis时,就会调用一次Lambda函数,该函数会读取味精并在插入Redshift之前进行一些处理。
因此,如果出现一些错误并且Lambda函数在执行处理时崩溃,并且需要几分钟甚至几个小时(我什至不知道那是否有可能)重新出现,该怎么办。它会继续从上一条未读消息中读取Kinesis,还是从最新插入的消息中读取Kinesis(因为这是调用事件)。
谢谢。
答案 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提取数据,并通过重新调用该功能来处理重试。另一个服务不负责推送数据。