我目前在 lambda 中有一个函数,当调用它时,它会向调用它的用户发送一条消息。两天后我想发送一条后续消息。发送实际消息的所有代码都运行正常。
我使用 Lambda 是因为其具有自动扩展功能,理想情况下,我希望避免设置单独的数据库来存储用户 ID、原始交互的时间戳(这样我就可以计算出跟进时间)和 2 天后的跟进消息。这样做的原因是由于扩展,因为我不确定峰值何时会到来。这是一个短期项目,但预计参与度很高,但时间未知且各不相同。
我最初考虑使用 SNS 来调用另一个 lambda 函数来处理数据,但后来我发现 SNS 不支持定时消息。理想情况下,我也不想涉及轮询其他服务。对此有什么好的解决方案吗?
我意识到不使用数据库是一个很大的限制,如果我必须使用一个,那么我就会使用一个,但仍然不必轮询会很有用(我想我可以安排一个 lambda 函数并在 dynamodb 中的时间戳上创建一个索引)
答案1
最近宣布的AWS Step Functions
服务可以帮助您实现您所描述的内容。该服务可以协调应用程序组件(例如Lambda
函数)的执行。它为您提供了一个图形控制台,您可以在其中对它们之间的依赖关系进行建模,并定义一个捕获应用程序工作流的有限状态机。您可以在以下链接中找到有关该服务的更多信息:
回到您的案例。Step Functions 为您提供了一种Wait
状态,可延迟状态机继续运行一段时间。因此,您的应用程序工作流程可能如下所示:
状态FirstState
将执行一个 lambda 函数send a message to a user who invoked it
。然后,它将等待 2 天,以wait_using_seconds
状态表示,最后它将执行一个 lambda 函数“发送后续消息”,以FinalState
状态表示。
状态机的定义如下Amazon States Language
:
{
"Comment": "An example of the Amazon States Language using wait states",
"StartAt": "FirstState",
"States": {
"FirstState": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT:function:FUNCTION1",
"Next": "wait_using_seconds"
},
"wait_using_seconds": {
"Type": "Wait",
"Seconds": 172800,
"Next": "FinalState"
},
"FinalState": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT:function:FUNCTION2",
"End": true
}
}
}