AWS 之上的可扩展 cron 架构
Scalable cron architecture on top of AWS
我们有客户使用的 Web 应用程序,他们可以选择创建报告。报告包含 电子邮件 和 预定时间 (例如:每天,9 a.m。)。
当预定时间与当前时间匹配时,Web 应用程序会做一些工作并将结果发送到电子邮件。
我有一项要求,需要在 swf 之上实施可扩展的 cron 架构。
我需要的架构如下所示:
- 用户创建报告(完成)
- Webapp 将报告保存到数据库,并通过 SQS(简单查询服务)将报告数据和计时器发送到 cron 微服务。 (完成)
- Cron 微服务读取传入的 SQS 消息并在计时器结束时发回 SQS 消息。 (需要这个)
- 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 一起使用。
方案一:
- Webapp 发送 SQS 消息。
- SQS 消息触发 Lambda 函数 1
- Lambda 函数创建 CWE 规则
- CWE 规则触发 Lambda 函数 2
- Lambda 函数 2 将 SQS 消息发送回 webapp。
限制:
我们只能为每个区域创建 100 个 CWE 规则。这意味着 webapp 无法生成超过 100 个具有预定日期的报告。
听起来您可以使用 AWS Lambda 作为您的摄取点,让函数从传入的 SQS 消息中触发,进行处理,然后发回 SQS 消息。
仅在步骤 3 中使用 SWF 未免有些矫枉过正。但是使用它来将步骤 2 到 4 作为单个工作流来实施是有意义的。这样您就不需要 SQS 依赖项,应用程序更简单并且您可以更好地了解您的流程。
很遗憾,SWF 不提供受支持的 nodejs 客户端库。它也不支持自动缩放,因为您必须 运行 工作进程。但是可以在其之上实现自动缩放。
我没有找到我的问题的确切解决方案,但找到了另一种方法来使用 CloudWatchEvent 和 SQS 服务实现我的目标。
而不是使用 params 从 cron 微服务接收单独的 cron SQS 消息,并进行分析、通知工作。
我们将逻辑移动到后端应用程序,如下所示:
- 已创建从 CloudWatchEventRule
接收消息的 SQS 队列 ("cron-microservice-dev")
- 创建了每 1 小时发送一次 SQS 队列的 CloudWatchEventRule(我们可以使用类似 cron 的语法更改计时器)。因此,CWE 规则每 1 小时向 SQS 队列发送消息。
- 现在后端侦听 "cron-microservice-dev" 队列并从数据库检查是否存在应触发的计划报告。如果有报告,它将
分析每份报告并通知接收者。
您不需要 cron,您只需要使用正确的队列类型。
对于 SQS 和其他队列(即 RabbitMQ),它们具有所谓的 "dead letter exchange",您可以向特定队列添加 time-to-live (TTL)。 SQS 的解决方案称为延迟队列,当您向它们推送消息时,您的订阅者在延迟过去之前不会收到它们。
你必须在创建队列时声明延迟间隔,但它非常简单。我相信你必须先选择一个FIFO类型的队列,然后设置延迟间隔。
其他队列你可以在消息上设置TTL并声明死信交换(意思是消息过期后,它将推送到目标队列)。这是创建延迟的好技巧,您的订阅者正在监听延迟后推送到的队列中的新消息。
- 选择
FIFO queue
和"Configure"
- 设置
Delivery Delay
我们有客户使用的 Web 应用程序,他们可以选择创建报告。报告包含 电子邮件 和 预定时间 (例如:每天,9 a.m。)。
当预定时间与当前时间匹配时,Web 应用程序会做一些工作并将结果发送到电子邮件。
我有一项要求,需要在 swf 之上实施可扩展的 cron 架构。
我需要的架构如下所示:
- 用户创建报告(完成)
- Webapp 将报告保存到数据库,并通过 SQS(简单查询服务)将报告数据和计时器发送到 cron 微服务。 (完成)
- Cron 微服务读取传入的 SQS 消息并在计时器结束时发回 SQS 消息。 (需要这个)
- 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 一起使用。
方案一:
- Webapp 发送 SQS 消息。
- SQS 消息触发 Lambda 函数 1
- Lambda 函数创建 CWE 规则
- CWE 规则触发 Lambda 函数 2
- Lambda 函数 2 将 SQS 消息发送回 webapp。
限制: 我们只能为每个区域创建 100 个 CWE 规则。这意味着 webapp 无法生成超过 100 个具有预定日期的报告。
听起来您可以使用 AWS Lambda 作为您的摄取点,让函数从传入的 SQS 消息中触发,进行处理,然后发回 SQS 消息。
仅在步骤 3 中使用 SWF 未免有些矫枉过正。但是使用它来将步骤 2 到 4 作为单个工作流来实施是有意义的。这样您就不需要 SQS 依赖项,应用程序更简单并且您可以更好地了解您的流程。
很遗憾,SWF 不提供受支持的 nodejs 客户端库。它也不支持自动缩放,因为您必须 运行 工作进程。但是可以在其之上实现自动缩放。
我没有找到我的问题的确切解决方案,但找到了另一种方法来使用 CloudWatchEvent 和 SQS 服务实现我的目标。
而不是使用 params 从 cron 微服务接收单独的 cron SQS 消息,并进行分析、通知工作。 我们将逻辑移动到后端应用程序,如下所示:
- 已创建从 CloudWatchEventRule 接收消息的 SQS 队列 ("cron-microservice-dev")
- 创建了每 1 小时发送一次 SQS 队列的 CloudWatchEventRule(我们可以使用类似 cron 的语法更改计时器)。因此,CWE 规则每 1 小时向 SQS 队列发送消息。
- 现在后端侦听 "cron-microservice-dev" 队列并从数据库检查是否存在应触发的计划报告。如果有报告,它将 分析每份报告并通知接收者。
您不需要 cron,您只需要使用正确的队列类型。
对于 SQS 和其他队列(即 RabbitMQ),它们具有所谓的 "dead letter exchange",您可以向特定队列添加 time-to-live (TTL)。 SQS 的解决方案称为延迟队列,当您向它们推送消息时,您的订阅者在延迟过去之前不会收到它们。
你必须在创建队列时声明延迟间隔,但它非常简单。我相信你必须先选择一个FIFO类型的队列,然后设置延迟间隔。
其他队列你可以在消息上设置TTL并声明死信交换(意思是消息过期后,它将推送到目标队列)。这是创建延迟的好技巧,您的订阅者正在监听延迟后推送到的队列中的新消息。
- 选择
FIFO queue
和"Configure" - 设置
Delivery Delay