【问题标题】:How to control event handling rate with a serverless stack如何使用无服务器堆栈控制事件处理率
【发布时间】:2021-04-20 19:44:49
【问题描述】:
我必须获取一个限制为几百请求/分钟的外部 API,以处理未知数量的事件:上周事件(我存储为 dynamoDB 对象的事件),并使用每个事件调用此 API .
我的第一个想法是做以下事情:
- 从 dynamo 获取特定日期的所有事件(但我可以获取更少)
- 将这些事件放入 SQS 队列中
- 让 SQS 事件触发另一个 lambda,其保留并发设置足够低(假设为 2),它将请求 API。
由于 lambda 的持续时间约为 100 毫秒,我在这里最多可以有 20 个请求/秒吗?
我的逻辑在这里正确吗?
谢谢。
【问题讨论】:
标签:
aws-lambda
amazon-sqs
serverless
aws-serverless
【解决方案1】:
我认为您的解决方案通常是有道理的。您应该注意的另一件事是 SQS 队列上的 VisibilityTimeout。这基本上意味着
隐藏已读取 ${VisibilityTimeout} 秒的任何内容,然后再使其可见以供再次处理
请记住,如果您在 Lambda 中遇到错误,队列消息将仅保留在队列中。如需更多信息,请联系see this article,我觉得这很有帮助。
如果您的外部 API 仍然遇到限制问题,您可以采取的另一种方法是设置一个 CloudWatch 事件,该事件每隔一段时间(比如说每 5 分钟)唤醒一次并显式调用您的 lambda。您需要改造您的 Lambda 以显式读取队列中的消息,然后处理它们。这将使您能够使用 SQS SDK 上的receiveMessage method 对“sip”消息进行更多控制。