从SNS调用AWS Lambda时似乎可用性不高

时间:2018-10-16 23:17:01

标签: amazon-web-services aws-lambda amazon-sns high-availability

我通过以异步方式提交〜5k sns请求来批量调用数据处理lambda。这将导致所有请求在很短的时间内命中sns。我注意到的是,我的lambda似乎恰好有5k错误,然后似乎“醒来”并处理了负载。

我在这里做的事情大都超出了普通用例吗? 有什么办法可以解决这个问题?

enter image description here

1 个答案:

答案 0 :(得分:3)

我怀疑这是并发与lambda连接到SNS的方式的结合。

Lambda只是如此擅长自动扩展以应对负载峰值。

详细信息在这里:(https://docs.aws.amazon.com/lambda/latest/dg/scaling.html),但要注意的重点

  1. 有一个帐户范围内的并发限制,您可以要求设置为 上调。默认情况下,它小于5k,因此将限制 并发您的lambda可能会变成。
  2. 有一个硬扩展限制(+1000实例/分钟),这意味着即使,如果您设法说服AWS让您的并发限制为30k,则必须在承受30分钟的持续负载之前,您需要一次运行那么多lambda。

SNS是基于非流的异步调用(https://docs.aws.amazon.com/lambda/latest/dg/invoking-lambda-function.html#supported-event-source-sns),因此您看到的是很多错误,因为每个SNS尝试调用5k lambda,但只有第一个X(例如1k)通过,但他们一直在重试。然后,队列在您的初始突发(通常为1k,具体取决于您的区域)同时清除,每分钟+ 1k,直到达到最大容量。

请注意,SNS仅按时间间隔重试3次(AWS对该时间间隔略有粗略,但是它可能基于服务返回的retry: delay,因此应该是近似智能的);建议您设置DLQ,以确保您不会因为队列清除的时间而丢弃消息。

虽然您的模式不是模式,但似乎您很容易陷入围绕lambda的并发问题。

一种替代方法是使用基于流的事件源(如Kinesis),该事件源按设置的并发性进行批处理(例如,每个lambda 500条记录,通过分片计数并发,而不是使用SNS进行1:1),然后等待在处理下一个批次之前先完成每个批次。