使用 NServiceBus 在生产中设置 RabbitMQ 集群的最佳实践

Best Practice for setting up RabbitMQ cluster in production with NServiceBus

目前我们有 2 个负载平衡的 Web 服务器。我们刚刚开始通过 NSB 公开一些功能。如果我创建两个 "app" 服务器,我会在所有 4 个服务器之间创建一个集群吗?或者我应该创建 2 个集群?

集群 1:Web 服务器 A,应用服务器 A

集群 2:Web 服务器 B,应用服务器 B

好像如果它是一个集群,如果同一个逻辑订阅者同时部署到应用程序服务器 A 和 B,我如何防止发布的消息被同一逻辑订阅者处理多次?

这是我将 RabbitMQ 放在 Web 服务器上以实现消息持久性的唯一原因(假设我在 Web 服务器上也没有任何应用程序服务 运行)?在那种情况下,我的假设是我然后使用集群镜像将消息发送到应用程序服务器。这是正确的吗?

端点与服务器

NServiceBus 使用端点的概念。端点与其接收消息的队列相关。如果此端点为高可用性或性能而横向扩展,那么您仍然有一个队列(使用 RabbitMQ)。因此,如果您在服务器 A 和 B 上有一个 运行ning 实例,它们(使用 RabbitMQ)都从同一个队列获取消息。

我不会考虑应用服务器,但会考虑端点及其在部署、可用性和性能方面的非功能性需求。

可用性与性能与部署

不需要在服务器 A 和 B 上托管所有端点。您还可以 运行 在服务器 A 上为 X 和 Y 提供服务,在服务器 B 上为 U 和 V 提供服务。然后您可以横向扩展以获得性能,但是不是为了可用性,但由于消息传递的异步性质,可用性已经不是什么问题了。这可以使部署更容易。

Pubsub 与请求响应

如果同一个逻辑端点部署了多个实例,那么哪个实例处理一个事件应该无关紧要。如果是,那么它可能不是发布订阅,而是异步请求/响应。这是由 NServiceBus 通过为每个实例(使用 RabbitMQ)创建一个队列来处理的,如果该响应需要与请求实例的亲和力,则可以在其中接收响应。

拓扑结构

你有:

  • 负载平衡网络场集群
  • 负载均衡的 RabbitMQ 集群
  • NServiceBus 端点
    • 不同机器上的高可用多个实例
    • 在各种机器上传播端点(每个端点甚至可以是一台机器)
    • 两者的结合

基础设施

您可以选择 运行 RabbitMQ 集群与您的网络场在同一基础设施上,或者单独进行。这取决于您的要求和可用资源。如果网络场和 rabbit 集群是分开的,那么您可以更轻松地独立扩展。