在无服务器环境中安排一次性事件的最佳方式



示例用例

在注册 2 小时后向用户发送通知。

考虑的备选办法

setTimeout(() => { /* send notification */ }, 2*60*60*1000);在无服务器环境中不是一个选项,因为函数在执行后终止(因此它必须是无状态的(。

CloudWatch 事件可以使用 cron 表达式来计划 lambda 调用 - 但这是为重复调用而设计的(每个区域限制为 100 个规则(。

我还没有在 AWS SNS/SQS 或 GCP Pub/Sub 中看到调度选项。调度有替代方案吗?

我想避免(如果可能(设置专用消息代理(矫枉过正(或有状态/无服务器实例 - 有没有无服务器的方法可以做到这一点?

我可以对数据库中的事件进行排队,并每分钟调用一个 lambda 函数来轮询数据库中要在该分钟内执行的事件......有没有更优雅的解决方案?

使用 AWS Step 函数,它们就像无服务器函数,不像 AWS Lambda 那样有 15 分钟的限制。 您可以在 AWS 步骤中设计一个与 API 网关、Lambda 和 SNS 集成的工作流,以发送电子邮件和文本通知,如下所示:

  1. 通过 API 网关创建一个 REST API,该 API 将调用传入的 Lambda 函数,例如,SNS 通知的目标地址(电子邮件、电话 #(、应发送的时间、通知方法(例如电子邮件、文本等(。
  2. 调用时的 Lambda 函数将调用传入数据的 Step 函数
  3. (需要 Lambda,因为 API 网关当前无法直接调用 Step 函数(。
  4. Step 函数基本上是一个工作流,您可以定义等待状态(例如等待指定时间发送通知,例如 30 秒(,以及调用可以使用 SNS 发送电子邮件和/或文本通知的其他 Lambda 函数的状态。

AWS 提供了一个基本示例,其中包含他们的任务计时器示例。

GCP 正在为此做准备,但不会很快。因此,今天的解决方案是轮询数据库。

您可以使用数据存储/firestore来索引执行日期时间(以防止每分钟读取所有文档(。但要小心流量高峰,您可能会创建热点。

您可以在 Google Cloud Platform 上使用 Cloud Scheduler。如官方文件所述:

云调度程序是一个完全托管的企业级 cron 作业调度程序。它允许您安排几乎任何作业,包括批处理、大数据作业、云基础架构操作等。您可以自动化所有操作,包括在失败时重试,以减少手动工作和干预。云调度程序甚至可以充当单一管理平台,允许您从一个地方管理所有自动化任务。

在这里,您可以查看将其与发布/订阅和云功能一起使用的快速入门。

最新更新