从 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),但要注意的关键点是
- 有一个帐户范围的并发限制,您可以要求
上调。默认情况下它远小于 5k,因此这将限制如何
并发你的 lambda 可能会成为。
- 有一个硬扩展限制 (+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 ), 并等待每批完成后再处理下一批。
我通过以异步方式提交 ~5k sns 请求以批量方式调用数据处理 lambda。这导致所有请求在很短的时间内命中 sns。我注意到我的 lambda 似乎正好有 5k 个错误,然后似乎 "wake up" 并处理负载。
我在这里做的事情是否在很大程度上超出了普通用例? 有什么办法可以解决这个问题吗?
我怀疑这是并发性和 lambda 连接 SNS 的方式的结合。
Lambda 只是 所以 擅长自动扩展以处理负载峰值。
完整的细节在这里:(https://docs.aws.amazon.com/lambda/latest/dg/scaling.html),但要注意的关键点是
- 有一个帐户范围的并发限制,您可以要求 上调。默认情况下它远小于 5k,因此这将限制如何 并发你的 lambda 可能会成为。
- 有一个硬扩展限制 (+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 ), 并等待每批完成后再处理下一批。