使用 sqs 时是否可以延迟几天?

Is it possible to give a few days delay when using sqs?

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

时实现一个逻辑来写入数据库

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

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

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

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

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

您可以将事件存储在 DynamoDB 和 setup TTL. You would need to also enable streams 中,并让 lambda 响应任何 TTL 事件。这包括将它们写入您的目标数据库。

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

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

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

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

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

动态等待直到由输入 (expirydate-key) 确定的时间点的等待状态如下所示:

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

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

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

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