在AWS上构建可扩展的cron架构

3
我们有一个Web应用程序,客户可以使用它创建报告。报告包含电子邮件和计划时间(例如:每天上午9点)。
当计划时间与当前时间匹配时,Web应用程序会执行一些操作并将结果发送到电子邮件中。
我有一个要求,需要在swf之上实现可扩展的cron架构。
我需要的架构如下:
1. 用户创建报告(完成) 2. Web应用程序将报告保存到数据库,并通过SQS(简单查询服务)将报告数据和计时器发送到cron微服务。(完成) 3. Cron微服务读取传入的SQS消息,并在定时器过期时发送回SQS消息。(需要这个) 4. Web应用程序读取SQS消息并触发数据分析器和邮件发送功能以发送分析后的数据。(完成)
从我了解的SWF服务来看,我们可以创建cron作业和SWF自动缩放。如何使用SWF创建可扩展的cron微服务?
欢迎任何建议...
附言:Web应用程序是使用nodejs编写的,最好使用nodejs编写微服务。

更新 1:花费一些时间研究可能的解决方案后,我找到了https://github.com/capside/CloudCron项目。但它依赖于云监控事件。对于许多定时任务来说,我认为它可能会收取很高的费用。

更新 2: Banjo Obayomi建议使用带有SQS和CWE的Lambda函数。

解决方案 1:

  1. Web应用程序发送SQS消息。
  2. SQS消息触发Lambda函数1
  3. Lambda函数创建CWE规则
  4. CWE规则触发Lambda函数2
  5. Lambda函数2将SQS消息发送回Web应用程序。

限制: 我们每个区域只能创建100个CWE规则。这意味着Web应用程序无法生成超过100个具有计划日期的报告。

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

4个回答

2

是的,这也是一种使用它的方式。但出于某些原因,我想避免使用它。 - omurbek
你会很遗憾,这是你尝试做的工作类型中最具成本效益的解决方案。 - Banjo Obayomi
我想,现在我理解了你的想法。Lambda函数1.监听sqs消息并2.等待计时器到期然后3.发送sqs消息。 问题是:1)我如何使lambda函数等待? 2)如何使lambda函数重复发送sqs消息,例如:每2小时发送一次电子邮件? 3)如何从lambda函数中删除cron任务? - omurbek
Lamda 还可以使用 Cloudwatch 事件,以获得所需的每 x 小时。 https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/events/RunLambdaSchedule.html - Banjo Obayomi
我了解了lambda函数和CWE规则,并更新了问题,需要反馈。 - omurbek

2
使用SWF仅仅为了步骤3是过度的,但是将步骤2到4作为单个工作流程实现使用它是有意义的。这样你就不需要SQS依赖,应用程序更简单,而且你可以更好地了解你的流程。
不幸的是,SWF没有提供支持Node.js客户端库。它也不支持自动缩放,因为你必须运行工作进程。但是可以在其之上实现自动缩放。

2

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

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

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

0

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

使用 SQS 和其他队列(例如 RabbitMQ),它们都有所谓的“死信交换”和您可以为特定队列添加生存时间(TTL)。SQS 的解决方案称为延迟队列,当您将消息推送到它们时,您的订阅者在延迟过去之前不会收到它们。

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

对于其他队列,您可以在消息上设置TTL并声明死信交换(意味着在消息过期后,它将被推送到目标队列)。这是一个不错的技巧,可以创建一个延迟,并且您的订阅者在延迟后会监听被推送到的队列中的新消息。

  1. 选择FIFO队列并点击“配置” Create new FIFO queue
  2. 设置交付延迟 Set the Delay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接