【问题标题】:Is it possible to give a few days delay when using sqs?使用sqs时可以延迟几天吗?
【发布时间】:2021-10-15 17:25:12
【问题描述】:

我需要在我的 lambda 中处理一些事件。当 lambda 接收到一个事件时,它需要更新数据库中的数据。但是该事件包括一个date,这是一个未来的日期,我需要实现一个逻辑,以便在未来date 时写入数据库。

例如,如果今天是2021-08-20,当我恢复这个事件时,我需要在 11 天后写入数据库。我正在考虑将这些事件放在 SQS 延迟队列中,但它最多有 15 分钟的延迟时间。而且远远低于我的预期(可能是几周甚至几个月后)。

{
   effectDate: "2021-09-01",
   value: xxxx
}

另一个解决方案是在我的 lambda 中创建一个 cloudwatch 规则。该规则将触发另一个 lambda 写入 db。此解决方案还有一个限制,即 cloudwatch 规则每个区域最多有 100 条规则。我每天可能会收到数千个事件,因此我不能依赖此解决方案。

使用 dynamodb TTL + 流式传输可能有效,但问题是 dynamodb TTL 在 48 小时内无法正常工作。它每 48 小时运行一次 TTL 调度程序,这意味着我无法安排触发时间少于 48 小时的事件。

有什么办法可以解决这个问题吗?

【问题讨论】:

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


    【解决方案1】:

    鉴于您似乎对解决方案有限制,您可以简单地将事件保存在数据库中并围绕它编写自己的逻辑。

    例如,您可以每 5 分钟触发一次 lambda(使用 cloudwatch 规则)来处理最后 5 分钟所需的事件。您当然可以使用此间隔的长度,并且不处理触发的 lambda 中的事件,而是将它们放在队列中以供另一个 lambda 处理(必要时并行处理)会更加稳健。

    这需要更多的工作,但您可以更好地控制何时发生的事情。

    【讨论】:

      【解决方案2】:

      您可以为此使用阶跃函数。在 Step Functions 中有一个等待状态,它允许您暂停执行直到某个时间点或一段时间。这可以在每次执行时设置。

      等待状态的文档可以在这里找到:Amazon State Language: Wait

      动态等待直到输入(过期键)确定的时间点的等待状态如下所示:

      "wait_until" : {
          "Type": "Wait",
          "TimestampPath": "$.expirydate",
          "Next": "NextState"
      }
      

      你可以在几秒钟内做同样的事情:

      "wait_until" : {
          "Type": "Wait",
          "SecondsPath": "$.waitForSeconds",
          "Next": "NextState"
      }
      

      一般的想法是,您创建一个步骤函数,其中包含一个提取等待时间量的任务,下一个状态是等待状态,在等待状态之后您执行任何必要的处理。

      【讨论】:

      • 等待状态是否有最长可以等待的天数?比如几个月、几年等。我在配额docs.aws.amazon.com/step-functions/latest/dg/… 中找不到它。我只能看到 1 年的空闲时间。是等待状态的限制吗?
      • 我想就是这样,是的 - 它受到步进函数一年的最大执行时间的限制。
      【解决方案3】:

      您可以将事件存储在 DynamoDB 和 setup TTL 中。您还需要启用streams 并让 lambda 响应任何 TTL 事件。这包括将它们写入您的目标数据库。

      【讨论】:

      • 我已经考虑过这个解决方案,但 DynamoDB TTL 在 48 小时内无法正常工作。有时我需要在一小时后安排活动。
      • @JoeyYiZhao 然后你需要创建一个 cloudwatch 事件调度规则,并且每 1h 执行一个 lambda 函数来检查需要写入你的主数据库中的 dynamodb 记录。您的排序键可以是时间戳。
      猜你喜欢
      • 2014-07-04
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 2012-07-16
      相关资源
      最近更新 更多