您如何始终将AWS Lambda触发器强制退出SQS?

时间:2019-02-05 17:27:32

标签: amazon-web-services aws-lambda amazon-sqs

我们注意到,将AWS Lambda设置为从SQS触发时,很多情况下触发发生在几分钟,有时长达一小时。我知道AWS Lambda会在内部进行轮询,并且当队列为空时,它可能会进行一些指数补偿。

但是,我们有一个调度程序,该调度程序每30分钟运行一次,并将数据推送到队列中。但是,lambda的触发时间要晚得多。一分钟内触发的业务要求。

是否有一种方法可以强制Lambda始终检查队列?一种替代方法是使用步进函数,但是由于该线程中的另一个答案-> How do you run functions in parallel?

我还考虑将数据推送到s3中,并从s3异步获取lambda触发器,而不是对其进行轮询,但是当我们要推送大量记录以便输出时,s3没有批处理api。

2 个答案:

答案 0 :(得分:0)

事实证明,使用AWS开发工具包时对async / await的使用错误。他们仅支持.promise()。这就是并非所有邮件都以sqs结尾的原因。

希望它对他人有帮助。 AWS正在开发支持异步/等待的新SDK。这是他们的链接 https://github.com/aws/aws-sdk-js-v3/issues/153#issuecomment-457769969

答案 1 :(得分:-1)

我将检查以确保SQS是长拉还是短拉。

“在几乎所有情况下,Amazon SQS长轮询比短轮询更可取。长轮询请求使您的队列使用者在到达队列后立即接收消息,同时减少了返回的空ReceiveMessageResponse实例的数量。

在大多数用例中,Amazon SQS长时间轮询可降低成本,从而提高性能。但是,如果您的应用程序期望ReceiveMessage调用立即做出响应,则在不对应用程序进行一些修改的情况下,您可能无法利用长时间轮询。

例如,如果您的应用程序使用单个线程轮询多个队列,则从短轮询切换为长轮询可能不会起作用,因为单个线程将在任何空队列上等待长轮询超时,从而延迟了处理可能包含消息的任何队列中。

在这样的应用程序中,优良作法是使用单个线程仅处理一个队列,从而使该应用程序能够利用Amazon SQS长轮询提供的优势。”

此外,如果您希望关闭lambda函数,是否可以为SQS设置SNS通知系统?与SQS SNS Lambda相似。这应该使您花费一分钟的时间,并且您不会经常拉动消息队列。您只需在SNS上进行操作即可。

https://aws.amazon.com/sqs/faqs/