【问题标题】:How to trigger lambda with some delay when message published to SQS?消息发布到 SQS 时如何延迟触发 lambda?
【发布时间】:2019-08-24 17:06:47
【问题描述】:

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

  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

我正在使用AWS::SQS::QUEUEDelaySeconds 属性,这显然不起作用。一旦消息发布到队列,我的 lambda 就会被执行。我怎样才能延迟呢?

【问题讨论】:

  • 嗯,这按预期工作。 DelaySeconds 将在指定的时间内延迟将消息传递到队列。这并不意味着它会在这段时间内不可见,因此一旦消息进入队列,您的 Lambda 函数就会尝试将其拾取。恐怕你想要达到的目标是不可能的。我真的没有看到这样做有很大的好处。也许如果你稍微重构一下你的架构,你就不需要这些类型的解决方法
  • @ThalesMinussi 感谢您的回复。我的用例是,在执行特定任务一分钟后,我需要在另一个 lambda 中执行一些操作。所以我将一条消息推送到队列(触发另一个 lambda),希望它会在一分钟后执行。这有意义吗?
  • 恐怕您无法使用 SQS 实现这一目标。我看到的一种方法(不用想太多)是在 DynamoDB 中创建一个包含该消息的项目。然后,您可以将云监视事件与 Lambda 挂钩,例如每 10 秒轮询一次此 DynamoDB 表,因此每次它看到尚未运行的新项目时,您就会调用您的 Lambda。现在我把问题还给你:这有意义吗?
  • 我说的是 10 秒,但它是一个随机数。如果您想每分钟查看一次,则每分钟运行一次云观看事件。但是,它可能会落入一些灰色区域,您的物品在 1 分 59 秒内不会被拾取。如果你能等那么久,我认为这应该没问题。您还可以在 DynamoDB 表中添加一列,其中包含有关何时运行的信息。因此,如果您运行 CloudWatch 事件并且 item.shouldRunAt 晚于当前时间,请不要执行任何操作并等待下一次执行
  • 可以的,step函数呢?如果我创建一个步进函数,其中第一步只是延迟一分钟,然后我的 lambda 可以执行。

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


【解决方案1】:

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

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

【讨论】:

  • 我得出了同样的结论。谢谢@Ronyis
  • @AffanShahab 您可能想查看批处理窗口功能。看我的回答。
【解决方案2】:

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 分钟的消息。

【讨论】:

  • 感谢您提供更新的答案,我已经很久没有这样做了,目前还没有参与该项目。以后有需要我会检查的
【解决方案3】:

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

如果您希望您的 lambda 在触发后的某个时间间隔后执行,请在开始执行之前放置一个 sleep(n) 并在需要时增加 lambda 超时。到目前为止,还没有直接的方法来延迟触发器,只要消息在队列中,您的 lambda 就会被触发。

【讨论】:

  • 这不是最佳解决方案,因为 lambda 的成本与执行时间绑定
  • @Nikaidoh 绝对正确。它会根据在特定时间内使用的内存量增加开销成本。
猜你喜欢
  • 2019-08-16
  • 2019-03-10
  • 2018-09-30
  • 2022-01-06
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
相关资源
最近更新 更多