【问题标题】:Scalable cron architecture on top of AWS基于 AWS 的可扩展 cron 架构
【发布时间】:2019-04-08 17:47:11
【问题描述】:

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

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

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

我需要的架构如下所示:

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

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

欢迎任何建议...

附: 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 函数 2 将 SQS 消息发送回 webapp。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 是的,这也是使用它的一种方式。但由于某些原因,我想避免它。
    • 那你会倒霉的,它是你尝试做的工作类型的最具成本效益的解决方案。
    • 我想,现在我明白了你的想法。 Lambda 函数 1. 监听 sqs 消息 2. waits until timer elapses 然后 3. 发送 sqs 消息。问题是:1)如何让 lambda 函数等待? 2) 如何让 lambda 函数重复发送 sqs 消息,例如:send email every 2hours? 3) 如何从 lambda 函数中删除 cron 任务?
    • Lamda 也可以使用 cloudwatch 事件,每隔 x 小时获得所需的 docs.aws.amazon.com/AmazonCloudWatch/latest/events/…
    • 我了解了 lambda 函数和 CWE 规则以及更新的问题,需要反馈。
    【解决方案2】:

    仅将 SWF 用于第 3 步会有点过头了。但使用它来将第 2 步到第 4 步作为一个单一的工作流程来实现是有意义的。这样您就不需要 SQS 依赖项,应用程序更简单,并且您可以更好地了解您的流程。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        1. 选择FIFO queue 和“配置”
        2. 设置Delivery Delay

        【讨论】:

          猜你喜欢
          • 2019-07-05
          • 1970-01-01
          • 1970-01-01
          • 2016-12-06
          • 2010-10-12
          • 1970-01-01
          • 2011-05-21
          • 2020-12-14
          • 1970-01-01
          相关资源
          最近更新 更多