使用 Lambda 事件源映射进行 SQS 批处理

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

我正在尝试使用 SQS 和 Lambda 进行一些测试,并且在 SQS 和函数之间的事件源映射上将批处理大小设置为 10,并将批处理窗口设置为 10。

我在 8 秒的窗口中发送了 8 条消息,我希望在 10 秒后看到一个函数调用,事件中包含所有 8 条消息,但实际上我观察到的是 4 个单独的函数调用,消息体中的数量不同。

我是否误解了这些配置设置,或者队列设置中是否有某些内容导致了这种情况?

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

我发布此内容是为了防止其他人发现,但我确实联系了 AWS 并收到了以下回复,我希望这对其他人可能有用:

我了解您希望使用事件源映射从 SQS 触发 Lambda 函数。在测试中,您注意到一些奇怪的行为,特别是;通过将批量大小设置为 10 并向队列发送 8 条消息,您期望看到包含 8 条消息的批量的单个 lambda 调用,但您观察到的是 4 个 lambda 调用。如果我有任何误解,请随时纠正我。

解释一下,为了使配置为事件源的 SQS 队列的 Lambda 函数能够最佳扩展,应满足以下条件:

  • 该函数不会产生任何错误。
  • SQS 队列中有足够的消息。
  • AWS 区域中有足够的未预留并发量,或者该函数的预留并发量对于标准队列至少为 1,000,或者相当于活动消息组的数量或对于 FIFO 队列而言更高。

当消息可用时,Lambda 最多读取五个批次并将它们发送到您的函数 [1]。当队列中的项目较少时,批次将小于最大批次大小(即 10)。因此,如果您的 SQS 队列的消息少于 1,000 条,那么您不太可能在调用中收到整批 10 条消息。

根据上面的内容,如果队列深度较大(即队列中有许多消息 - 基于 ApproximateNumberOfMessagesVisible 指标),您只会收到完整批次。当您使用一些消息进行测试时,当消息可用时,Lambda 最多读取五个批次,因此每个批次的数量将小于批次大小,直到队列中有足够的消息来读取完整批次。

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