【问题标题】:Why lambda function getting invoked asynchronously为什么 lambda 函数被异步调用
【发布时间】:2021-03-22 02:03:32
【问题描述】:

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

【问题讨论】:

  • 如果你的 lambda 在批处理窗口之前达到所需的批处理大小,它会被调用吗?我的理解正确吗?
  • @Prashanna 它在达到批量大小时被调用,但我看到的问题是,它以相同的批量大小异步执行。所以例如如果有 20k 条消息且批处理大小为 5k,它将开始 4 个同时执行,批处理大小为 5k

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


【解决方案1】:

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

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

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

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

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

来自docs

当您将 SQS 队列配置为事件源并且消息被 可用于处理,Lambda 以最大并发开始 五。最佳情况下,具有 Amazon SQS 触发器的 Lambda 函数可以扩展 每分钟最多 60 个额外实例,最多 1,000 个并发 调用。

您在问题/cmets 中解释的行为在预期中。

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

【讨论】:

  • 非常感谢! “强制 lambda 运行单线程的唯一方法是将保留并发设置为 1”解决了它。
猜你喜欢
  • 1970-01-01
  • 2021-02-03
  • 2020-03-04
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 2019-08-05
相关资源
最近更新 更多