无服务器中的 SQS 触发 lambda 存在延迟

Posted

技术标签:

【中文标题】无服务器中的 SQS 触发 lambda 存在延迟【英文标题】:SQS triggering lambda in Serverless has latency 【发布时间】:2021-12-07 19:20:36 【问题描述】:

下面有一个用例

    StepFunction -> Lambda -> EventBridge 到 SQS 触发 lambda

当消息接收到 Eventbridge 时,它​​将发布到 SQS,SQS 将触发 lambda。我在这里注意到的是,每次推送一些消息时,几乎需要 21 秒才能到达最终的 lambda。

SQS 的配置:

可见性超时:30 秒 死信队列:已启用 延迟交付:0 receiveMessageDelay:尝试了短轮询和长轮询

Lambda 在 VPC 内部

当我进行分析时,所有的桥梁都在瞬间发生,但 SQS 触发 Lambda 需要 21 秒。

所有博客都说,它会立即发生,但对我来说没有运气。

不确定我的配置是否错误。任何帮助对我来说都更有价值。

谢谢, 古纳

【问题讨论】:

从 21 秒开始,我可能认为您设置了长轮询(最长 20 秒)。设置Receive message wait time 1 秒怎么样? @shimo,是的,我进行了短轮询和长轮询(0 和 1 和 20)。但对于所有人来说,延迟都是一样的。但是,有时它的工作速度非常快,与短期或长期民意调查无关。 您的工作流程有什么特别的原因吗?能不能去掉一些元素,比如 SQS 队列? 是的,我们更喜欢在信函保留期(最多 4 天)和死信队列的简单设置中使用 SQS 【参考方案1】:

经过进一步调查,注意到 SQS 触发 lambda 设置在 serverless 中配置为 maximumBatchingWindow,以指定在调用函数之前收集记录的最长时间(以秒为单位)。批量大小为 1 时不需要。

【讨论】:

【参考方案2】:

扩展 Guna 自己的答案,我们遇到了同样的问题,发现原因是记录在案的 SQS 限制,因为我们将 batchSize 配置为 100,maximumBatchingWindow 配置为 1。

AWS 声明:

如果您使用批处理窗口并且您的 SQS 队列包含非常低的流量,则 Lambda 可能会等待长达 20 秒,然后再调用您的函数。即使您将批处理窗口设置为低于 20 秒也是如此。

来源:https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html

一旦我们删除了batchSizemaximumBatchingWindow 配置设置,SQS-Lambda 调用延迟就会显着降低。

【讨论】:

以上是关于无服务器中的 SQS 触发 lambda 存在延迟的主要内容,如果未能解决你的问题,请参考以下文章

更长触发 lambda 的 SQS 消息

如何从外部 SQS 队列活动触发 AWS Lambda 函数

消息发布到 SQS 时如何触发 lambda?

使用 AWS 无服务器和 NodeJS 在接收器 lambda 处未接收到来自 SQS 的所有消息

在 SQS 消息触发的 Lambda 上跟踪 AWS API Gateway request_id

使用 Amazon SQS 完成 Lambda 函数时通知浏览器客户端