AWS之上的可扩展cron架构

时间:2018-11-05 11:07:22

标签: node.js amazon-web-services cron amazon-sqs amazon-swf

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

预定时间当前时间匹配时,网络应用会执行一些工作并将结果发送到电子邮件中。

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

我所需的架构如下:

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

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

打开任何建议...

P.S。 Web应用程序是用nodejs编写的,因此最好用nodejs编写微服务。

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

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

解决方案1:

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

限制: 我们每个区域只能创建 100条CWE规则。这意味着webapp不能按预定日期生成100多个报告。

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

仅将SWF用于步骤3可能会过大。但是,将SWF用作单个工作流程来实现步骤2到4是很有意义的。这样,您就不需要SQS依赖关系,应用程序更简单,并且可以更好地了解过程。

不幸的是,SWF不提供受支持的nodejs客户端库。它还不支持自动缩放,因为您必须运行辅助进程。但是自动缩放可以在其之上实现。

答案 2 :(得分:2)

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

与其使用 params 从cron微服务接收单个cron SQS消息,而是进行分析,通知工作。 我们将逻辑移至后端应用程序,如下所示:

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

答案 3 :(得分:0)

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

使用SQS和其他队列(即RabbitMQ),它们具有所谓的“死信交换”,您可以向特定队列添加生存时间(TTL)。 SQS的解决方案称为“延迟队列”,当您向其发送消息时,直到延迟过去,订户才收到它们。

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

其他队列,您可以在消息上设置TTL并声明交换死信(这意味着消息过期后,它将把它推送到目标队列)。这是创建延迟的好方法,您的订户正在侦听队列中的新消息,该消息在延迟后被推送到该队列。

  1. 选择FIFO queue并“配置” Create new FIFO queue
  2. 设置Delivery Delay Set the Delay