【问题标题】:What is the best way to schedule tasks in a serverless stack?在无服务器堆栈中安排任务的最佳方式是什么?
【发布时间】:2022-10-30 08:09:57
【问题描述】:

我正在将 NextJS 和 Firebase 用于应用程序。用户可以在一段时间内租用产品。在那之后,应该触发一个无服务器功能来更新数据库等。由于 NextJS 是事件驱动的,我似乎无法弄清楚如何安排一个任务,该任务在租期结束并更新数据库时执行。

也许在其他地方处理的 cron 作业(Easy Cron 等)是一种解决方案。或者可能只是用于安排这些任务的 EC2 实例。

【问题讨论】:

    标签: firebase amazon-ec2 next.js serverless


    【解决方案1】:

    由于这是用 AWS EC2 标记的,因此我认为可以建议考虑 AWS 服务的解决方案。

    您可以做的是利用 DynamoDB 的速度和排序功能。如果您指定的表同时具有分区键和范围键,则数据将自动按 UTF-8 顺序排序。这意味着 iso-timestamp 值可用于对历史数据进行排序。

    考虑到这一点,您可以将表设计为在所有用户(将它们全部分组)中具有全局常量值的分区键和isoDate#userId 的排序键,同时还创建一个 GSI(全局二级索引) userId 作为分区键,isoDate 作为范围键。

    对数据进行排序后,您可以使用 BETWEEN 查询来提取适合您的时间窗口的条目。

    安排 1 lambda 每分钟(左右)运行一次,并提取即将过期的条目以通知它们。

    重要的提示:此排序方法适用于所有范围键有相同的大小,由于使用 UTF-8 进行排序的工作原理。如果您的应用程序使用 UUID 作为 id,您可以轻松完成此操作。如果没有,您可以简单地生成一个随机 UUID 以附加到 isoTimestamp,因为您只需要它来避免罕见的精确时间重复。

    示例:假设您要提取在 2022-10-10T12:00:00.000Z 小时附近到期的所有数据:

    您的查询将是BETWEEN 2022-10-10T11:59:00.000Z#00000000-0000-0000-0000-000000000000 and 2022-10-10T12:00:59.999Z#zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz

    时间戳可能有点偏差,但你明白了。 00.. 是 UUID 的开始 UTF8,而 zz..(或 fff..)是结束。

    【讨论】:

      【解决方案2】:

      在 AWS 中,使用 AWS 控制台为 Lambda 创建定期触发器非常简单直接。

      Login to console and navigate to CloudWatch.
      Under Events, select Rules & click “Create Rule”
      You can either select fixed rate or select Cron Expression for more control
      Cron expression in CloudWatch starts from minutes not seconds, important to remember if you are copying Cron expression from somewhere else.
      Click “Add Target”, select “Lambda Function” from drop down & then select appropriate Lambda function.
      If you want to pass some data to the target function when triggered, you can do so by expanding “Configure Input”
      

      【讨论】:

      • 周期性触发似乎相当简单。我正在考虑更多地在预定义的时间安排触发器。例如,用户的租期在下午 1:00 结束,我想在 5 分钟前通知他们。如何安排函数在下午 12:55 准确触发?
      猜你喜欢
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 2016-02-14
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      相关资源
      最近更新 更多