我通过以异步方式提交〜5k sns请求来批量调用数据处理lambda。这将导致所有请求在很短的时间内命中sns。我注意到的是,我的lambda似乎恰好有5k错误,然后似乎“醒来”并处理了负载。
我在这里做的事情大都超出了普通用例吗? 有什么办法可以解决这个问题?
答案 0 :(得分:3)
我怀疑这是并发与lambda连接到SNS的方式的结合。
Lambda只是如此擅长自动扩展以应对负载峰值。
详细信息在这里:(https://docs.aws.amazon.com/lambda/latest/dg/scaling.html),但要注意的重点
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),然后等待在处理下一个批次之前先完成每个批次。