首页 > 解决方案 > 使用 SQS 触发器进行 Lambda 扩展

问题描述

我已经SQS为我的 Lambda 定义了一个触发器。在 Lambda 内部,我正在调用api基于令牌(每分钟 250 个令牌)的第 3 方。最初我定义了一个批处理大小250,批处理窗口65s,但是发生的事情是 lambdaconcurrently可以处理请求并且令牌很快就用完了。

然后在更改批处理大小、窗口和并发的各种值之后,最终该过程开始顺利运行,批处理大小为 10,批处理窗口为 10,保留并发为 7,但当时队列中只有 3,00,000 个产品 ID。昨天,当我将 400 万个产品 ID 推送到队列时,代币再次开始很快耗尽。当我检查日志时,我发现 Lambda 以不同的时间间隔选择不同数量的消息,例如有时一分钟需要 200 条消息,有时需要 400 条消息。这个数字每次都不同。

我想要的是,无论队列中有多少消息,Lambda 都应该在 1 分钟内从队列中选择 250 条消息。这个怎么做?

在此处输入图像描述

标签: amazon-web-servicesaws-lambdaamazon-sqsaws-serverless

解决方案


我不认为 SQS 是解决这类问题的合适产品。您正在寻找的是节流,而 SQS 可能不是用于此目的的正确工具。

例如。您将批量大小设置为 10,将窗口设置为 10。这并不意味着您认为它意味着什么。

您告诉 SQS 在最多 10 秒内最多批处理 10 个项目。但是如果 SQS 在 1 秒后有 10 个项目,它会触发你的 Lambda。

查看您的要求,看起来您将更多数据放入队列中,而不是从中读取。

考虑到这一点,我建议您先将这些数据写入 DynamoDB,然后执行由 EventBridge 触发的作业,该作业每分钟运行一次,并从 DynamoDB 中准确提取 250 个项目(或任何数量的令牌)并完成工作。

总之:

  1. 将您的物品放入 SQS
  2. 从 SQS 触发 Lambda A
  3. Lambda A 将其写入 DynamoDB
  4. 创建 EventBridge 规则以每 60 秒触发一次 Lambda B
  5. Lambda B 从 DynamoDB 中读取 n 个项目并对其进行处理

推荐阅读