【问题标题】:Lambda with SQSEvent & large batch size invokes multiple instances each handling few items具有 SQSEvent 和大批量大小的 Lambda 调用多个实例,每个实例处理少量项目
【发布时间】:2021-07-08 14:04:24
【问题描述】:

一点背景, 我正在使用 Serverless 和 .Net 创建带有 SQS 触发器的 lambda。 事件触发器设置为批处理大小为 10k,等待时间(批处理窗口,即MaximumBatchingWindowInSeconds)为 30 秒。 队列的可见性超时设置为将近 16 分钟。

现在我已将 lambda 设置为仅 1 的保留并发并运行了一个测试,其中我将 100 个项目发送到队列并希望只看到一个包含这 100 个项目的 lambda 调用。

问题在于它将队列中的项目分开并调用 lambda 五次,导致创建五个包作为 lambda 功能的一部分,而不是我想要的一个包。 (仅供参考,lambda 的输出在消息的 s3 中创建包。我想要更少的大包。)

现在的问题:这是预期的行为吗?如果是这样,为什么当我将队列设置为最多可累积 10k 个项目时,它会变成 15 个。

根据aws docs,如果有效负载大于 256kb,则 lambda 可以获取比 batchSize 更少的消息,但我的消息非常小,100 条消息远不及 256kb。所以这不可能是原因。

也欢迎提出处理此问题的替代方案的建议,现在我正在考虑运行一个事件桥调度程序,该调度程序使用 SQS ReceiveMessage api 调用 lambda 并创建一个包,但我还必须确保正确删除之后排队。

我在这里有点无能为力,如果你们有任何想法,我将不胜感激。谢谢。

【问题讨论】:

  • 什么是 sqs 触发器批量大小?
  • 问题中说:10k
  • 有这方面的消息吗?我也是这种情况

标签: amazon-web-services aws-lambda concurrency amazon-sqs


【解决方案1】:

问题是它分离了队列中的项目并改为调用 lambda 五次,导致创建五个包作为 lambda 功能的一部分,而不是我想要的一个包。 p>

我认为这可能是因为 lambda 使用 五个 SQS 池线程来池 SQS。来自AWS blog

Lambda 服务将使用五个并行长轮询连接开始轮询 SQS 队列。

因此,即使您保留了 1 个并发,lambda 仍然使用 5 个线程(您无法控制),并且您的 SQS 消息被分发到这些线程中。然后,每个线程一个接一个地调用您的 lambda 函数,导致观察到 5 次调用。

【讨论】:

  • 所以@Marcin 你是说,无论batchIndex 设置什么,它都会获取该数字除以5?它会忽略MaximumBatchingWindowInSeconds?听起来像一个 AWS 错误。没有?
  • @Rafi 没有记录它是如何工作的确切细节,至少我不知道在哪里。但是你总是有这五个线程在拉。所以你的实验同意线程的使用。也许您可以尝试做一些其他测试来进一步评估池行为,记住这 5 个线程。
【解决方案2】:

我认为 FIFO 队列可能是您的解决方案:

“FIFO(先进先出)队列旨在在操作和事件的顺序至关重要或不能容忍重复时增强应用程序之间的消息传递。”

[https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html][1]

【讨论】:

    【解决方案3】:

    您可以尝试在事件源映射中设置MaximumBatchingWindowInSeconds 值。这允许您在调用 lambda 之前收集最多 5 分钟的消息。

    请记住,SQS 是一种排队机制,而不是批处理机制。批处理是事件源映射的一部分,或者通常可用于 SQS,旨在减少调用次数。它并非旨在提供有保证的批量大小。虽然设置上述值可能会实现您当前的目标,但我不知道您是否可以合理地期望它始终以这种方式工作。另请记住,SQS 是一种“至少一次”交付机制(除非您使用 FIFO,它的批次限制为 10)。

    【讨论】:

    • 我们尝试过,正如问题中所说的那样,我们将其设置为 30。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    相关资源
    最近更新 更多