【问题标题】:Message Broker - dependency between jobsMessage Broker - 作业之间的依赖关系
【发布时间】:2019-02-17 19:39:53
【问题描述】:

我正在尝试找到一个好的队列服务器/消息代理,它可以让我能够将作业推送到队列,但也可以:

  1. 在作业之间建立依赖关系(例如,仅在作业 A 完成后运行作业 B)
  2. 如果订阅者未能执行任务,则允许重新运行任务(不将其从订阅者推回队列)
  3. 持久性(在服务器重启等情况下)
  4. 扩展(在服务器加载时能够添加更多节点)
  5. 优势:AWS 中的托管解决方案

我知道很多名字,比如 RabbitMQ、ActiveMQ、Kafka,但我想听听真实生活的经验,而不仅仅是我已经读过的文章。

【问题讨论】:

  • 所以您想在消息代理的帮助下编排您的工作流程? IMO 你不需要在这里发送消息 - 有像 Apache Oozie(Hue 在这里非常有用)这样的轴心解决方案来管理和协调复杂的作业依赖关系。

标签: apache-kafka rabbitmq activemq amazon-sqs messagebroker


【解决方案1】:

我也有同样的要求,我评估了 RabbitMQ 和 Apache Kafka 等不同的队列服务,但所有这些服务都需要我们维护和管理自己的服务器。这样做的问题是维护我们自己的服务器的成本很高,而且我们需要自己根据可扩展性来管理它(除非我们使用提供可扩展性的服务器)。

然后我切换到AWS SQSAWS Lambda 非常适合我的要求。主要优点是,它完全无服务器,AWS 将处理它的可扩展性。我们需要跟踪每个服务的限制,只有当我们扩展到非常大的级别时才会受到影响。

现在,让我们看看这个解决方案将如何满足您的要求。

  1. 在作业之间建立依赖关系(例如,仅在作业 A 完成后运行作业 B)

当 SQS 接收到消息时,您可以调用 Lambda 函数(作业 A)并让该函数调用(作业 B)以确保维持顺序。类似的方法可以在没有 Lambda 的情况下使用,您可以在每个作业完成后按照您想要的顺序引导消息。使用 AWS SQS 和 Lambda 的优势在于,SQS 提供了调用 lambdas 的功能(2018 年 6 月推出的功能),我们不需要每次都轮询队列。

  1. 如果订阅者未能执行任务,则允许重新运行任务(没有 将其从订阅者推回队列)

如果订阅者失败,您可以将消息发送到死信队列 (DLQ),这是另一个 SQS 队列,用于存储接收者失败的消息。 (见this link)。有了这个,您可以使用与 1. 中提到的类似的方法,您可以让 DLQ 中的消息单独处理。

  1. 持久性(在服务器重启等情况下)

SQS 将您的消息保留一段给定的时间。您可以指定要将消息存储在队列中的时间段。如果您想要硬持久性,在一定时间后不会过期,请考虑将其存储在数据库或其他存储机制(如 S3)中。

  1. 缩放(在服务器加载时能够添加更多节点)

默认情况下,AWS 提供高可扩展性,其中为每项服务设置了某些限制。充分意识到限制,只有当我们进入非常大的规模时才会超过限制。 (始终可以通过联系 AWS 支持团队来增加)

  1. 优势:AWS 中的托管解决方案

如上所述,这些 AWS 服务由 AWS 自己管理。因此,只要您保持在限制范围内,就没有什么可担心的。

您在问题中提到的所有解决方案都很好,但它的有用性取决于用例场景。根据上面提到的要求,AWS SQS 将是这个场景的理想选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2010-11-18
    相关资源
    最近更新 更多