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

AWS Lambda is seemingly not highly available when invoked from SNS

我通过以异步方式提交 ~5k sns 请求以批量方式调用数据处理 lambda。这导致所有请求在很短的时间内命中 sns。我注意到我的 lambda 似乎正好有 5k 个错误,然后似乎 "wake up" 并处理负载。

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

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

Lambda 只是 所以 擅长自动扩展以处理负载峰值。

完整的细节在这里:(https://docs.aws.amazon.com/lambda/latest/dg/scaling.html),但要注意的关键点是

  1. 有一个帐户范围的并发限制,您可以要求 上调。默认情况下它远小于 5k,因此这将限制如何 并发你的 lambda 可能会成为。
  2. 有一个硬扩展限制 (+1000 instances/minute),这意味着 even 如果你设法说服 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 服务 returns,因此应该是近似智能的) ;我建议您设置一个 DLQ 以确保您不会因为清除队列的时间而丢弃消息。

虽然您的模式不是 糟糕的 模式,但您似乎很容易受到围绕 lambda 的并发问题的影响。

另一种方法是使用基于流的事件源(如 Kinesis),它以设定的并发性进行批处理(例如,每个 lambda 500 条记录,按分片计数并发,而不是 1:1 使用 SNS ), 并等待每批完成后再处理下一批。