有可能在使用sqs时给予几天延迟吗?



我需要处理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小时触发的事件。

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

考虑到解决方案的限制,您可以简单地将事件保存在数据库中,并围绕它编写自己的逻辑。

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

这是更多的工作,但你将有更多的控制发生什么,当。

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

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

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

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

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

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

一般的想法是你创建一个阶跃函数的任务,提取等待的时间,下一个状态是等待状态,在等待状态之后,你做任何必要的处理。

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

最新更新