1

现在我正在研究如何提高 Rabbit 的效率。


例如:

成分:

  • TCP 负载均衡器
  • 生产者
  • RabbitMQ 集群
  • 消费者

生产商:

2-5 个 EC2 服务器。每个服务器都logstash安装并配置为向 Rabbit 发送消息。这没什么特别的。只有一个要求,消息需要持久化。(以防 I/O 不是问题)

RabbitMQ 集群:

2 个 EC2 服务器。大量的内存,cpu,良好的磁盘,良好的带宽。

消费者:

非常不同数量的消费者可能是 2-15。消费者连接到负载均衡器 (ELB)。其中一些使用basic.get其中一些使用basic.consume。要求:no_ack = False, 表示所有消息都需要被确认。


现在我们有一个队列可以容纳 95% 的流量。我的问题是:

  • 如果我在兔子集群中的每个节点上创建相同数量的队列。(现在我正在谈论如何分配这个高流量队列的负载。)每个生产者都会将消息发布到它自己的队列。另一端的消费者将订阅所有队列并从每个队列中获取消息。它会提高性能吗?
  • 交换和队列之间的一对一关系也会对性能产生任何影响吗?
  • 最后,在这种情况下你会推荐什么?(消费者不能动态配置)
4

1 回答 1

1

首先,如果您正在镜像队列并使用持久消息,那么您将损害性能。有关详细信息,请参阅我关于RabbitMQ HA 性能的文章。

尽管考虑更多队列以提高吞吐量是正确的 - 每个 RabbitMQ 都是一个 Erlang 进程,因此只会使用一个内核。当然还有其他 Erlang 进程会有所帮助,但你确实受到了单个队列的限制。答案是一致的散列交换类型,它将消息均匀地分配到与其连接的每个队列。YMMV,但我想您希望每台服务器的每个核心都有一个队列。

于 2014-04-06T21:51:16.700 回答