我有向其中发送数据的DynamoDb表,其中有一个正在由lambda处理的流,该流会汇总一些统计信息并将其重新插入表中。
我的问题是我的lambda处理事件的速度太快,因此几乎每个插入都被发送回dynamo表,并将它们重新插入到dynamo表中会导致节流。
我需要放慢lambda的速度!
我将并发设置为1
我曾经考虑过只在lambda代码中添加一个sleep语句,但这将是可计费的时间。
我可以延迟Lambda到每x分钟才启动一次吗?
答案 0 :(得分:3)
您不能轻易限制Lambda的运行频率,但是您可以重新架构一下事情,并使用预定的CloudWatch Event作为触发器而不是DynamoDB流。然后,您可以让Lambda每隔x分钟执行一次,整理自上次运行以来添加的记录的统计信息,然后将其推送到表中。
答案 1 :(得分:1)
我从来没有亲自尝试过,但是我认为您可以执行以下操作:
在流和Lambda之间放置delay queue。
也就是说,您将有一个新的Lambda函数,它只是将事件从DDB流推送到此SQS队列。您可以在队列中设置最多15分钟的延迟。然后,将原始Lambda设置为由此队列中的消息触发。但是SQS limits有所不同。
答案 2 :(得分:0)
不,很遗憾,您不能这样做。
将并发设置为1肯定会有所帮助,但无法解决。相反,您可以做的是稍微增加RCU一点以防止节流。
尽管为了避免问题,@ bwest的方法似乎非常好。我会去的。
答案 3 :(得分:0)
您可以执行以下操作
,而不是将延迟或并发设置为1,这将确保几件事
答案 4 :(得分:0)
根据lambda docs:“默认情况下,流中有记录时,Lambda会立即调用您的函数。如果从流中读取的批处理中只有一条记录,Lambda只会向该函数发送一条记录。为了避免使用少量的记录来调用该函数,您可以通过配置批处理窗口来告诉事件源最多将记录缓冲5分钟。在调用该函数之前,Lambda会继续从流中读取记录直到收集到完整的记录批处理,或者直到批处理窗口到期为止。”,使用此方法您可以添加一些延迟,甚至在收到批处理之后也可以顺序处理。同样,由于执行速度不是您的优先考虑事项,因此您也可以节省成本。更少的lambda函数调用,通过不进行睡眠节省了成本。来自aws lambda docs:“您将根据对函数的请求数和持续时间以及代码执行所花费的时间来付费。”