【发布时间】:2021-06-16 13:47:03
【问题描述】:
我已经为我的 Lambda 定义了一个 SQS 触发器。在 Lambda 内部,我正在调用基于令牌(每分钟 250 个令牌)的第 3 方 api。最初我定义了250 的批处理大小,65s 的批处理窗口,但发生的事情是 lambda 工作concurrently 来处理请求并且令牌很快耗尽。
然后在更改批处理大小、窗口和并发的各种值之后,最终该过程开始顺利运行,批处理大小为 10,批处理窗口为 10,保留并发为 7,但当时队列中只有 3,00,000 个产品 ID。昨天,当我将 400 万个产品 ID 推送到队列时,代币再次开始很快耗尽。当我检查日志时,我发现 Lambda 会以不同的时间间隔选择不同数量的消息,例如有时一分钟需要 200 条消息,有时需要 400 条消息。这个数字每次都不同。
我想要的是,无论队列中有多少消息,Lambda 都应该在 1 分钟内从队列中挑选出 250 条消息。如何做到这一点?
【问题讨论】:
-
批量大小为 10 时怎么会收到 200 或 400 条消息?
-
是的,这就是问题所在。我已经上传了日志。你可以检查一下。
-
@Marcin 那些 200 和 400 是每分钟,而不是批量大小。如果您将批量大小和窗口都设置为 10,那么这些值似乎没问题。
-
我可以计算的最大值是 350 条消息 = 7 并发 * 10 条批量消息 * 5 线程。但如果你的函数运行时间少于 1 分钟,那么你可以轻松超过 400 分钟。但无论如何,答案是你无法完全控制它。它取决于 AWS 如何汇集和扩展汇集。
-
是的@Maurice。同样使用这种方法,lambda 选择的消息数量每次都不同。
标签: amazon-web-services aws-lambda amazon-sqs aws-serverless