为什么 lambda 函数被异步调用

Why lambda function getting invoked asynchronously

我有一个由 SQS 事件触发的 lambda 函数。 lambda 设置为在批次 x 中使用消息,并在 y 秒中使用批次 window,即 Batch Size= xBatch Window = y。然而,注意到 lambda 被 Batch Size= x 异步触发。据我了解 Batch Window = y 意味着 lambda 将在开始执行前轮询消息 y 秒。请指教

BathSize and BatchWindow 用于控制调用 lambda 的次数,通过让 lambda poller 在调用 lambda 之前累积消息,主要是为了节省成本。

BatchSize - 在调用 lambda 之前累积的最大事件数。 BathWindow -(最近添加)在调用 lambda 之前累积事件的最大时间量。(最多 5 分钟)

没有 BatchWindow,只要事件可用(SQS 上的可见性超时),它们就会被发送到 lambda,而不管 batchSize 是否达到。但现在它一直等到 BatchWindow 而不管 batchSize。

但是,无论是否设置了 BatchWindow,一次 运行 的 lambda 实例的数量永远不会是 1。SQS 轮询器从最多 5 个 lambda 线程开始,并且可以扩展到 1000。

将 lambda 强制为 运行 单线程的唯一方法是将保留并发设置为 1。这将导致节流并最终会成功。

来自docs

When you configure an SQS queue as an event source and messages are available for processing, Lambda begins with a maximum concurrency of five. Optimally, Lambda functions with an Amazon SQS trigger can scale up 60 additional instances per minute to a maximum of 1,000 concurrent invocations.

有了这个,您在 question/comments 中解释的行为符合预期。

BathSize:5k,BatchWindow:5 分钟。如果我们一次触发 20K 条消息到 SQS,在可见性超时期限 5 分钟后,将立即启动 4 个线程来处理这 20K 条消息。