Message Broker - 作业之间的依赖关系
Message Broker - dependency between jobs
我正在尝试寻找一个好的队列服务器/消息代理,它可以让我能够将作业推送到队列,而且还可以:
- 在作业之间建立依赖关系(例如,运行作业 B 仅在作业 A 完成后)
- 如果订阅者未能执行任务,则允许重新运行任务(不将其从订阅者推回队列)
- 持久性(在服务器重启等情况下)
- 扩展(能够在服务器加载的情况下添加更多节点)
- 优势:AWS 中的托管解决方案
我知道很多名字,比如 RabbitMQ、ActiveMQ、Kafka,但我想听听现实生活中的经验,而不仅仅是我已经读过的文章。
我也有同样的要求,我评估了不同的队列服务,如 RabbitMQ 和 Apache Kafka,但所有这些服务,都需要我们维护和管理我们自己的服务器。这样做的问题是维护我们自己的服务器成本很高,我们需要在可扩展性上自己管理它(除非我们使用提供可扩展性的服务器)。
然后我切换到 AWS SQS, with AWS Lambda,这非常适合我的要求。主要优势在于,它完全无服务器,AWS 将处理它的可扩展性。我们需要跟踪每个服务的限制,只有当我们扩展到非常大的级别时,这些限制才会受到影响。
现在,让我们看看这个解决方案如何满足您的要求。
- 在作业之间建立依赖关系(例如,仅在作业 A 完成后 运行 作业 B)
当 SQS 收到消息时,您可以调用 Lambda 函数(作业 A)并让该函数调用(作业 B)以确保维护顺序。可以在没有 Lambdas 的情况下使用类似的方法,您可以在每个作业完成后按照您想要的顺序定向消息。使用AWS SQS和Lambda的好处是,SQS提供了调用lambdas的功能(2018年6月推出的功能),我们不需要每次都轮询队列。
- 如果订阅者未能执行任务,允许重新运行任务(没有
将其从订阅者推回队列)
如果订阅者失败,您可以将消息发送到死信队列 (DLQ),这是另一个 SQS 队列,用于存储接收者失败的消息。 (参见 this link)。这样,您就可以使用与 1. 中提到的类似方法,其中您可以让 DLQ 中的消息单独处理。
- 持久性(在服务器重启等情况下)
SQS 会在给定的时间段内保存您的消息。您可以指定要将消息存储在队列中的时间段。如果你想要硬持久化,它在一定时间后不会过期,可以考虑将其存储在数据库或其他存储机制(如 S3)中。
- 缩放(能够在服务器加载的情况下添加更多节点)
默认情况下,AWS 提供高可扩展性,其中为每项服务设置了某些限制。充分意识到局限性,只有当我们进入非常大的规模时,它才会超过这些局限性。 (这可以随时通过联系 AWS 支持团队来增加)
- 优势:AWS 中的托管解决方案
如上所述,这些 AWS 服务由 AWS 自己管理。所以没有什么可担心的,只要你在限制范围内。
你在问题中提到的所有解决方案都很好,但它的用处取决于用例场景。根据提到的要求,AWS SQS 将是这种场景的理想选择。
我正在尝试寻找一个好的队列服务器/消息代理,它可以让我能够将作业推送到队列,而且还可以:
- 在作业之间建立依赖关系(例如,运行作业 B 仅在作业 A 完成后)
- 如果订阅者未能执行任务,则允许重新运行任务(不将其从订阅者推回队列)
- 持久性(在服务器重启等情况下)
- 扩展(能够在服务器加载的情况下添加更多节点)
- 优势:AWS 中的托管解决方案
我知道很多名字,比如 RabbitMQ、ActiveMQ、Kafka,但我想听听现实生活中的经验,而不仅仅是我已经读过的文章。
我也有同样的要求,我评估了不同的队列服务,如 RabbitMQ 和 Apache Kafka,但所有这些服务,都需要我们维护和管理我们自己的服务器。这样做的问题是维护我们自己的服务器成本很高,我们需要在可扩展性上自己管理它(除非我们使用提供可扩展性的服务器)。
然后我切换到 AWS SQS, with AWS Lambda,这非常适合我的要求。主要优势在于,它完全无服务器,AWS 将处理它的可扩展性。我们需要跟踪每个服务的限制,只有当我们扩展到非常大的级别时,这些限制才会受到影响。
现在,让我们看看这个解决方案如何满足您的要求。
- 在作业之间建立依赖关系(例如,仅在作业 A 完成后 运行 作业 B)
当 SQS 收到消息时,您可以调用 Lambda 函数(作业 A)并让该函数调用(作业 B)以确保维护顺序。可以在没有 Lambdas 的情况下使用类似的方法,您可以在每个作业完成后按照您想要的顺序定向消息。使用AWS SQS和Lambda的好处是,SQS提供了调用lambdas的功能(2018年6月推出的功能),我们不需要每次都轮询队列。
- 如果订阅者未能执行任务,允许重新运行任务(没有 将其从订阅者推回队列)
如果订阅者失败,您可以将消息发送到死信队列 (DLQ),这是另一个 SQS 队列,用于存储接收者失败的消息。 (参见 this link)。这样,您就可以使用与 1. 中提到的类似方法,其中您可以让 DLQ 中的消息单独处理。
- 持久性(在服务器重启等情况下)
SQS 会在给定的时间段内保存您的消息。您可以指定要将消息存储在队列中的时间段。如果你想要硬持久化,它在一定时间后不会过期,可以考虑将其存储在数据库或其他存储机制(如 S3)中。
- 缩放(能够在服务器加载的情况下添加更多节点)
默认情况下,AWS 提供高可扩展性,其中为每项服务设置了某些限制。充分意识到局限性,只有当我们进入非常大的规模时,它才会超过这些局限性。 (这可以随时通过联系 AWS 支持团队来增加)
- 优势:AWS 中的托管解决方案
如上所述,这些 AWS 服务由 AWS 自己管理。所以没有什么可担心的,只要你在限制范围内。
你在问题中提到的所有解决方案都很好,但它的用处取决于用例场景。根据提到的要求,AWS SQS 将是这种场景的理想选择。