使用 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 集群是分开的,那么您可以更轻松地独立扩展。
目前我们有 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 集群是分开的,那么您可以更轻松地独立扩展。