问题描述
我必须获取一个限制为几百 req/min 的外部 API,以处理未知数量的事件:上周事件(我存储为 dynamoDB 对象的事件),并为每个事件调用此 API .
我的第一个想法是执行以下操作:
- 从 dynamo 获取特定日期的所有事件(但我可以获得更少)
- 将这些事件放入 SQS 队列
- 让 SQS 事件触发另一个 lambda,其保留并发设置得足够低(假设为 2 ),它将请求 API。 由于 lambda 的持续时间约为 100 毫秒,我在这里最多可以有 20 个请求/秒吗?
我的逻辑在这里正确吗?
谢谢。
解决方法
我认为您的解决方案通常是有道理的。您应该注意的另一件事是 SQS 队列上的 VisibilityTimeout
。这基本上意味着
隐藏已读取 ${VisibilityTimeout} 秒的任何内容,然后使其可见以供再次处理
请记住,如果您的 Lambda 出现错误,队列消息将仅保留在队列中。有关更多信息,请参阅 see this article,我觉得这很有帮助。
如果您的外部 API 仍然遇到限制问题,您可以采取的另一种方法是设置一个 CloudWatch 事件,该事件每隔一段时间(假设每 5 分钟)唤醒一次并显式调用您的 lambda。您需要改造 Lambda 以显式读取队列中的消息,然后处理它们。这将使您能够更多地控制使用 SQS SDK 上的 receiveMessage method 来“sip”消息。