【问题标题】:AWS Lambda: Execute function B 10 minutes after function AAWS Lambda:在函数 A 10 分钟后执行函数 B
【发布时间】:2018-12-14 20:46:23
【问题描述】:

我正在为时间敏感的应用程序开发无服务器后端。

是否可以在 Lambda 函数 A XX 分钟后执行 Lambda 函数 B

我正在寻找一个干净的无服务器解决方案。使用setTimeout 或类似的方法太过分了,无法接受。

示例:在 Lambda 函数执行 10 分钟后使用 SNS 发送通知。

【问题讨论】:

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


【解决方案1】:

最简单的方法是使用延迟交付的 SQS。

  1. Lambda-A 将消息添加到 SQS 队列并将传递延迟设置为 10 分钟。您可以设置 0 到 15 分钟之间的任何延迟。您还可以使用 SQS 延迟队列来延迟添加到队列中的所有消息。 https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html

  2. 10 分钟后 SQS 消息变得可见并且 SQS 触发 Lambda-B。

  3. Lambda-B 接收 Amazon SQS 事件并使用接收句柄从队列中删除消息。以下是来自https://docs.aws.amazon.com/lambda/latest/dg/eventsources.html#eventsources-sqs 的示例:

.

 "Records": [
    {
        "messageId": "c80e8021-a70a-42c7-a470-796e1186f753",
        "receiptHandle": "AQEBJQ+/u6NsnT5t8Q/VbVxgdUl4TMKZ5FqhksRdIQvLBhwNvADoBxYSOVeCBXdnS9P+erlTtwEALHsnBXynkfPLH3BOUqmgzP25U8kl8eHzq6RAlzrSOfTO8ox9dcp6GLmW33YjO3zkq5VRYyQlJgLCiAZUpY2D4UQcE5D1Vm8RoKfbE+xtVaOctYeINjaQJ1u3mWx9T7tork3uAlOe1uyFjCWU5aPX/1OHhWCGi2EPPZj6vchNqDOJC/Y2k1gkivqCjz1CZl6FlZ7UVPOx3AMoszPuOYZ+Nuqpx2uCE2MHTtMHD8PVjlsWirt56oUr6JPp9aRGo6bitPIOmi4dX0FmuMKD6u/JnuZCp+AXtJVTmSHS8IXt/twsKU7A+fiMK01NtD5msNgVPoe9JbFtlGwvTQ==",
        "body": "{\"foo\":\"bar\"}",
        "attributes": {
            "ApproximateReceiveCount": "3",
            "SentTimestamp": "1529104986221",
            "SenderId": "594035263019",
            "ApproximateFirstReceiveTimestamp": "1529104986230"
        },
        "messageAttributes": {},
        "md5OfBody": "9bb58f26192e4ba00f01e2e7b136bbd8",
        "eventSource": "aws:sqs",
        "eventSourceARN": "arn:aws:sqs:us-west-2:594035263019:NOTFIFOQUEUE",
        "awsRegion": "us-west-2"
    }
]

【讨论】:

  • 谢谢!你知道为什么最大延迟只有 15 分钟吗?
  • 我不知道为什么最大延迟是 15 分钟。这是 AWS 工程师做出的设计决定,我相信他们有他们的理由。
【解决方案2】:

是的,您可以使用SQS Delay Queues 来触发 lambda B。

步骤如下

创建一个消息延迟设置为 10 分钟的 SQS 队列 将 Lambda B 触发器设置为上述 SQS 现在在 Lambda 函数 A 执行后,在 SQS 上放一条消息

现在因为在 SQS 上设置了延迟,消息将在 10 分钟后可用,一旦可用,它将触发 Lambda B

【讨论】:

    【解决方案3】:

    您可以使用message timers in SQS 实现您想要的。

    函数 A 应将消息发布到延迟 10 分钟的队列,函数 B 应订阅该队列。

    【讨论】:

      【解决方案4】:

      我认为最简单的方法是使用 AWS Step Functions。 你可以 -

      1. 配置一个由函数A、等待状态、函数B组成的步进机。
      2. 从函数 A 调用步进机,它将由等待状态和函数 B 组成(如果您希望从函数 A 开始有延迟)。

      【讨论】:

      • 可以取消步进功能或修改时间吗?
      • 在步进函数中,您可以将一个步骤的输出用作另一个步骤的输入。如果一个步骤当前正在运行,您不能取消它(但您不需要这样做)。关于等待时间 - “您可以选择相对时间,以从状态开始时的秒数指定,或绝对结束时间,指定为时间戳。” (取自 [AWS 文档] (docs.aws.amazon.com/step-functions/latest/dg/…))。持续时间可能取决于状态的输入。
      猜你喜欢
      • 2021-11-10
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 2019-07-31
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多