【问题标题】:Why would you run a messaging queue (eg RabbitMQ) cluster?为什么要运行消息队列(例如 RabbitMQ)集群?
【发布时间】:2018-08-14 16:53:57
【问题描述】:

概览

RabbitMQ 代理是一个或多个 Erlang 的逻辑分组 节点,每个都运行 RabbitMQ 应用程序并共享用户, 虚拟主机、队列、交换、绑定和运行时参数。 有时我们将节点集合称为集群。

你为什么要这样做?我理解增加消息的持久性(如果一个节点出现故障,其他队列仍然会收到消息)。但是性能呢?集群如何提高性能。不是所有的消费者/生产者都连接到主节点的队列吗?如果是这样,我们是否仍然在单个节点上获得流量?我们是否放置了一个负载均衡器,以便每次将流量定向到不同的节点?

RabbitMQ 集群如何提高性能?

【问题讨论】:

  • 我不知道为什么这篇文章被否决了。

标签: rabbitmq queue distributed-system


【解决方案1】:

好吧,在那段之后,文档说明了以下内容:

什么是复制的?

运行 RabbitMQ 代理所需的所有数据/状态是 在所有节点上复制。一个例外是消息队列, 默认情况下驻留在一个节点上,尽管它们是可见的并且 可从所有节点访问。跨节点复制队列 集群,请参阅有关高可用性的文档(请注意,您 首先需要一个工作集群)。

因此,您可以通过集群在 RabbitMQ 代理中提供比单个节点单独提供的容量更大的容量。注意clustering by itself is not a high-availability strategy

您关于消息持久性增加的断言是错误的,因为消息队列继续驻留在一个代理上(除非使用镜像)。

默认情况下,RabbitMQ 集群中的队列内容位于单个节点(声明队列的节点)[1]

如果没有镜像,当该节点出现故障时,其上的消息将丢失。集群会将队列放到不同的节点上。 RabbitMQ does not handle network partitions well,所以这可能有点问题。

“无论如何,我们不是仍然在单个节点上获得流量吗?” - 如果您只有一个队列,那么可以。然而,一个更大的问题是“你为什么要运行一个只有一个队列的消息代理?”同样,如果你只在一个节点上创建队列,那么你仍然会在系统中出现一个故障点。

【讨论】:

  • 好的,对不起,我暗示队列是镜像的。那么在具有镜像队列(一个节点上的主队列,其他节点上的镜像队列)的集群中,它提供了性能提升还是容量提升?我都看不到。
  • 正确,它提供了可用性改进,这是不同的。
  • 实际上,架构合理的应用程序不应该依赖消息队列来进行任何类型的持久存储;因此,配置镜像的价值不大。
  • 那么集群与队列镜像提供了更高的可用性,但不会提高性能(即吞吐量)?可以做些什么来提高性能?
  • 正确。提高性能的答案取决于需要提高性能的哪个方面。
猜你喜欢
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 2013-12-22
  • 2019-01-31
  • 2011-06-30
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
相关资源
最近更新 更多