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

时间:2019-04-03 08:33:42

标签: triggers aws-lambda delay amazon-sqs aws-sam

我将lambda配置为在将消息发布到SQS队列时被触发。这是用于部署的SAM模板。

int firstval = 49;
button.setOnClickListener(v -> incValue());
private void incValue() {
    System.out.println(Integer.toString(firstval += 30));
}

我正在使用 MyQueue: Type: AWS::SQS::Queue Properties: VisibilityTimeout: 180 DelaySeconds: 90 MyLambda: Type: AWS::Serverless::Function Properties: CodeUri: ../pathToCode Handler: index.handler Events: MySQSEvent: Type: SQS Properties: Queue: !GetAtt MyQueue.Arn 的{​​{1}}属性,这显然不起作用。消息发布到队列中后,我的lambda将立即执行。我该如何延迟呢?

3 个答案:

答案 0 :(得分:3)

最好的解决方案是使用AWS Step Functions。

由SQS触发的lambda应该执行状态机,其中第一步是所需的睡眠量,第二步是lambda调用。

答案 1 :(得分:1)

延迟秒数:每当您轮询队列时,它都会延迟“接收消息”调用。但是,只要将消息推送到队列中,该消息就会立即插入。

如果您希望在触发后的一定间隔后执行lambda,请在开始执行之前放置sleep(n),并根据需要增加lambda超时。截至目前,尚无直接方法来延迟触发,一旦消息进入队列,您的lambda就会被触发。

答案 2 :(得分:1)

在 2021 年,最好的答案是使用 SQS 新的“批处理窗口”功能:

https://aws.amazon.com/about-aws/whats-new/2020/11/aws-lambda-now-supports-batch-windows-of-up-to-5-minutes-for-functions/

使用此功能,您可以让 SQS 队列在调用 Lambda 函数之前最多收集 5 分钟的消息。