我有一个由SQS触发的AWS Lambda函数。每天大约触发100次此功能,但到SQS队列的请求计数每天大约20.000次。我不明白为什么对SQS提出的请求数量太多。我的期望是,对SQS的请求数量应与Lambda调用相同。
我的帐户中只有一个Lambda函数和一个SQS队列。
可以与SQS队列的轮询相关吗?我试图从队列配置中更改SQS的轮询间隔,但未进行任何更改。另一种可能性是从Lambda函数配置更改轮询间隔。但是,我找不到任何相关参数。
简而言之,我想减少SQS请求的数量,同时使用SQS调用Lmabda函数时该怎么做?
答案 0 :(得分:9)
使用SQS作为AWS Lambda的事件源时,AWS Lambda会定期轮询已配置的SQS队列以获取新消息。尽管官方文档尚不清楚,但是blog post announcing that feature进入了详细信息:
最初创建并启用SQS事件源映射时,或者在没有流量的时间段后首次出现消息时,Lambda服务将开始使用五个并行的长轮询连接来轮询SQS队列。
根据AWS documentation,从AWS Lambda到SQS的长时间轮询的默认持续时间为20秒。
这会导致AWS Lambda函数每20秒向SQS发出五次请求,而没有明显的负载,每天总计约为21600,接近您遇到的20000。
虽然增加长轮询持续时间似乎是减少请求数量的简便方法,但这是不可能的,因为默认情况下AWS Lambda使用的20秒已经是maximum possible duration for an SQS queue。将它用作AWS Lambda的事件源时,恐怕没有简单的方法来减少对SQS的请求。取而代之的是值得评估是否另一个事件源(例如SNS)也适合您的用例。
答案 1 :(得分:2)
这是我们最初在没有SQS触发器的情况下实现的方式。
使用SQS Cloudwatch指标创建SNS触发器
roximateNumberOfMessagesVisible> 0
从SNS触发Lambda,从SQS读取消息并将其传递给需要消息的Lambda。
或者,您可以使用 Kinesis 将其交付给Lambda。
SQS-> Cloudwatch(触发Lambda)-> Lambda(读取消息)-> Kinesis(设置批次大小)-> Lambda(处理实际消息)
您也可以直接使用Kinesis,但不会延迟交付。
希望有帮助。