消息代理 - 作业之间的依赖关系



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如上所述,这些 AWS 服务由 AWS 本身管理。所以没有什么可担心的,只要你保持在限制范围内。

您在问题中提到的所有解决方案都很好,但它的有用性取决于用例场景。根据上述要求,AWS SQS 非常适合此场景。

最新更新