无服务器中的 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
一旦我们删除了batchSize
和maximumBatchingWindow
配置设置,SQS-Lambda 调用延迟就会显着降低。
【讨论】:
以上是关于无服务器中的 SQS 触发 lambda 存在延迟的主要内容,如果未能解决你的问题,请参考以下文章
如何从外部 SQS 队列活动触发 AWS Lambda 函数
使用 AWS 无服务器和 NodeJS 在接收器 lambda 处未接收到来自 SQS 的所有消息