具有SQSEvent和大批量大小的Lambda调用多个实例,每个实例处理几个项目

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

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

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

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

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

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

我在这里有点无能为力,我很感激你们的任何想法。谢谢。

回答

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

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

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

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


以上是具有SQSEvent和大批量大小的Lambda调用多个实例,每个实例处理几个项目的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>