如何限制 AWS 中 lambda 调用的最大数量?

问题描述 投票:0回答:1

我有一个由 FIFO SQS 触发的 lambda 函数。队列有 50,000 条消息需要处理,但我只想每小时处理 200 条。我该怎么做?这是一个更多关于解决方案架构的问题,而不是关于代码本身的问题。

谢谢你

amazon-web-services aws-lambda amazon-sqs
1个回答
0
投票

当然,可以通过几种不同的方式来控制从 SQS 队列处理消息的速率。考虑到您的限制(Lambda 函数、FIFO SQS 和特定速率),这里有一个架构解决方案:

  1. 使用SQS可见性超时

    • 当 Lambda 函数接收到消息时,根据 SQS 队列的“可见性超时”设置,该消息对其他接收者变得“不可见”。默认为 30 秒。
    • 如果您可以估算每条消息的处理时间,则可以相应地调整可见性超时。但仅此一点并不能帮助限制速率。
  2. 预定的 Lambda 函数:

    • 不要直接从 SQS 触发 Lambda,而是安排 Lambda 使用 Amazon CloudWatch Events(或 EventBridge)每小时运行一次。
    • 当 Lambda 被触发时,它会轮询 FIFO SQS 队列中的消息并进行处理,然后在处理 200 条消息后或没有更多消息时停止。请记住,轮询可能返回的消息数可能少于最大消息数,因此该函数应该循环,直到处理完 200 条消息或队列为空。
  3. 并发 Lambda 执行:

    • 控制Lambda函数的并发度。默认情况下,SQS 触发的 Lambda 函数将水平扩展,同时处理多批消息。
    • 将 Lambda 函数的保留并发度设置为 1。这可确保在任何给定时间只有一个 Lambda 函数实例正在处理消息。结合 Lambda 函数内部仅处理 200 条消息的逻辑,这会阻止该函数快速处理队列中的所有消息。
    • 此方法可确保如果您有大量消息,一次只会处理一个 Lambda 函数,每小时最多处理 200 条消息。

此方法可确保您每小时处理大约 200 条消息。根据 CloudWatch 事件的确切时间和 Lambda 执行时间,可能会出现微小的变化,但它应该接近您所需的速率。

© www.soinside.com 2019 - 2024. All rights reserved.