使用 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"
}
一般的想法是,您创建一个包含提取等待时间的任务的步进函数,下一个状态是等待状态,在等待状态之后,您可以进行任何必要的处理。
我需要在我的 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"
}
一般的想法是,您创建一个包含提取等待时间的任务的步进函数,下一个状态是等待状态,在等待状态之后,您可以进行任何必要的处理。