AWS 之上的可扩展 cron 架构

Scalable cron architecture on top of AWS

我们有客户使用的 Web 应用程序,他们可以选择创建报告。报告包含 电子邮件 预定时间 (例如:每天,9 a.m。)。

预定时间当前时间匹配时,Web 应用程序会做一些工作并将结果发送到电子邮件。

我有一项要求,需要在 swf 之上实施可扩展的 cron 架构。

我需要的架构如下所示:

  1. 用户创建报告(完成)
  2. Webapp 将报告保存到数据库,并通过 SQS(简单查询服务)将报告数据和计时器发送到 cron 微服务。 (完成)
  3. Cron 微服务读取传入的 SQS 消息并在计时器结束时发回 SQS 消息。 (需要这个)
  4. Webapp 读取SQS 消息并触发Data Analyzer 和Emailer 功能发送分析后的数据。 (完成)

据我了解 SWF 服务,我们可以创建 cron 作业和 SWF 自动缩放。如何使用 SWF 创建可扩展的 cron 微服务?

愿意接受任何建议...

P.S。 Web app是用nodejs写的,用nodejs写微服务会很不错

更新 1: 在花了一些时间研究可能的解决方案之后, 我找到了 https://github.com/capside/CloudCron 个项目。但它依赖于 cloudwatch 事件。对于许多计划任务,IMO 可能会收取很多费用。

更新二: Banjo Obayomi 建议将 Lambda 函数与 SQS 和 CWE 一起使用。

方案一:

  1. Webapp 发送 SQS 消息。
  2. SQS 消息触发 Lambda 函数 1
  3. Lambda 函数创建 CWE 规则
  4. CWE 规则触发 Lambda 函数 2
  5. Lambda 函数 2 将 SQS 消息发送回 webapp。

限制: 我们只能为每个区域创建 100 个 CWE 规则。这意味着 webapp 无法生成超过 100 个具有预定日期的报告。

链接: cron-in-aws-with-lambda-function

听起来您可以使用 AWS Lambda 作为您的摄取点,让函数从传入的 SQS 消息中触发,进行处理,然后发回 SQS 消息。

https://aws.amazon.com/blogs/aws/aws-lambda-adds-amazon-simple-queue-service-to-supported-event-sources/

仅在步骤 3 中使用 SWF 未免有些矫枉过正。但是使用它来将步骤 2 到 4 作为单个工作流来实施是有意义的。这样您就不需要 SQS 依赖项,应用程序更简单并且您可以更好地了解您的流程。

很遗憾,SWF 不提供受支持的 nodejs 客户端库。它也不支持自动缩放,因为您必须 运行 工作进程。但是可以在其之上实现自动缩放。

我没有找到我的问题的确切解决方案,但找到了另一种方法来使用 CloudWatchEvent 和 SQS 服务实现我的目标。

而不是使用 params 从 cron 微服务接收单独的 cron SQS 消息,并进行分析、通知工作。 我们将逻辑移动到后端应用程序,如下所示:

  1. 已创建从 CloudWatchEventRule
  2. 接收消息的 SQS 队列 ("cron-microservice-dev")
  3. 创建了每 1 小时发送一次 SQS 队列的 CloudWatchEventRule(我们可以使用类似 cron 的语法更改计时器)。因此,CWE 规则每 1 小时向 SQS 队列发送消息。
  4. 现在后端侦听 "cron-microservice-dev" 队列并从数据库检查是否存在应触发的计划报告。如果有报告,它将 分析每份报告并通知接收者。

您不需要 cron,您只需要使用正确的队列类型。

对于 SQS 和其他队列(即 RabbitMQ),它们具有所谓的 "dead letter exchange",您可以向特定队列添加 time-to-live (TTL)。 SQS 的解决方案称为延迟队列,当您向它们推送消息时,您的订阅者在延迟过去之前不会收到它们。

你必须在创建队列时声明延迟间隔,但它非常简单。我相信你必须先选择一个FIFO类型的队列,然后设置延迟间隔。

其他队列你可以在消息上设置TTL并声明死信交换(意思是消息过期后,它将推送到目标队列)。这是创建延迟的好技巧,您的订阅者正在监听延迟后推送到的队列中的新消息。

  1. 选择FIFO queue和"Configure"
  2. 设置Delivery Delay