我正在尝试使用 SQS 和 Lambda 进行一些测试,并且在 SQS 和函数之间的事件源映射上将批处理大小设置为 10,并将批处理窗口设置为 10。
我在 8 秒的窗口中发送了 8 条消息,我希望在 10 秒后看到一个函数调用,事件中包含所有 8 条消息,但实际上我观察到的是 4 个单独的函数调用,消息体中的数量不同。
我是否误解了这些配置设置,或者队列设置中是否有某些内容导致了这种情况?
我发布此内容是为了防止其他人发现,但我确实联系了 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 最多读取五个批次,因此每个批次的数量将小于批次大小,直到队列中有足够的消息来读取完整批次。