正好10分钟后,S3 Lambda触发双重调用

时间:2017-05-04 14:50:44

标签: amazon-web-services amazon-s3 aws-lambda eventtrigger

我们正在经历由S3 ObjectCreated-Events触发的Lambda的双Lambda调用。这些双重调用在第一次调用后10分钟完全发生,而不是在第一次尝试完成后10分钟,但在第一次调用发生后10分钟。原始调用需要0.1到5秒之间的任何内容。没有调用会导致错误,它们都会成功完成。

我们知道SQS例如不能保证完全一次但至少一次传递消息,我们会接受一些lambdas由于下面的分布式系统的结果而第二次被调用。然而,延迟10分钟听起来很奇怪。

大约10k条消息100-200导致双重调用。

AWS Support基本上说“10分钟的等待时间是设计的,但我们无法告诉您为什么”,这一点都没有帮助。

  • 之前有没有其他人经历过这种行为?
  • 你是如何解决这个问题的,或者你只是忽略它(我们可以做到的)?
  • 一个建议的解决方案不是使用直接的S3-lambda触发器,而是让S3将其事件放在SNS上并订阅一个Lambda。有这种方法的经验吗?

示例日志:两次调用,相隔10分钟,相同的RequestId

  

START RequestId:f9b76436-1489-11e7-8586-33e40817cb02版本:13
  2017-03-29 14:14:09 INFO ImageProcessingLambda:104 - 处理1条记录

  

START RequestId:f9b76436-1489-11e7-8586-33e40817cb02版本:13
  2017-03-29 14:24:09 INFO ImageProcessingLambda:104 - 处理1条记录

2 个答案:

答案 0 :(得分:1)

不想像Dynamo那样启动数据存储来处理这个问题,我做了两件事来解决我们的用例

  • 将每个函数的锁定文件写入S3(我们已经为此使用)并检查它是否存在于函数入口上,如果存在则中止;对于这个功能,我们只希望其中一个一次运行。在我们在出错或成功调用回调之前删除了锁定文件。
  • 在初始事件有效负载中写入请求时间,并检查函数输入的请求时间;如果请求时间太长则中止。除非他们快速完成,否则我们不希望Lambda重试错误,因此这将处理发送重复或重试的情况,而另一个同一函数的调用尚未运行(这将由锁定文件)并且还避免了在这种情况下锁文件处理的S3请求的最小开销。

答案 1 :(得分:1)

经过AWS支持和其他几次试运行以及一些单独的试运行后,似乎这只是“按设计”。目前尚不清楚为什么,但它只是发生了。问题既不是S3也不是SQS / SNS,而只是lambda调用以及lambda服务如何将调用分派给lambda实例。

在第一次调用后10分钟,双重调用发生在所有调用的1%到3%之间。令人惊讶的是,甚至有三次(可能是四次)调用基本概率的权率,所以基本上是0.09%,......三次调用发生在第一次调用后20分钟。

如果您遇到此问题,您只需使用您有权访问的内容解决问题。例如,我们现在将已经处理的实体存储在Cassandra中,TTL为1小时,并且如果尚未处理实体,则仅响应来自lambda的消息。双重和三重调用都发生在这一小时的时间范围内。