amazon-web-services - 使用 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 条消息。这个怎么做?
解决方案
我不认为 SQS 是解决这类问题的合适产品。您正在寻找的是节流,而 SQS 可能不是用于此目的的正确工具。
例如。您将批量大小设置为 10,将窗口设置为 10。这并不意味着您认为它意味着什么。
您告诉 SQS 在最多 10 秒内最多批处理 10 个项目。但是如果 SQS 在 1 秒后有 10 个项目,它会触发你的 Lambda。
查看您的要求,看起来您将更多数据放入队列中,而不是从中读取。
考虑到这一点,我建议您先将这些数据写入 DynamoDB,然后执行由 EventBridge 触发的作业,该作业每分钟运行一次,并从 DynamoDB 中准确提取 250 个项目(或任何数量的令牌)并完成工作。
总之:
- 将您的物品放入 SQS
- 从 SQS 触发 Lambda A
- Lambda A 将其写入 DynamoDB
- 创建 EventBridge 规则以每 60 秒触发一次 Lambda B
- Lambda B 从 DynamoDB 中读取 n 个项目并对其进行处理
推荐阅读
- html - 在网站上嵌入 Facebook“立即预订”功能
- python - 用于在特定条件下计数项目的 Python 代码?
- r - 根据数据框中的条件提取值
- bigdata - Spark 上的 Hive 和 Spark 同时使用 Hive 元存储?
- orm - 如何使用 @GeneratedValue(strategy = GenerationType.AUTO) 创建对象
- html - 分页位置不固定(Yii2)
- r - 如何使用 dplyr 获得具有多个样本的站点的物种丰富度和丰度
- cnf - 如何从给定的特征模型设计 CNF 文件?
- sql - 查找第二低的购买日期 SQL
- python - Tkinter 多个选项卡:(多线程或多处理)