RabbitMQ集群中的队列应如何分布?

RabbitMQ集群中的队列应如何分布?,rabbitmq,Rabbitmq,假设您有一个由3个节点组成的小型rabbitmq系统,该系统应能在同一个交换机中处理100多个相当大的容量队列。假设队列只存在于创建它们的节点上(我们不使用复制的高可用性队列),那么创建队列的最佳方法是什么?将队列分布在集群节点之间有什么好处吗?还是最好将它们都放在一个节点上,并由rmq进行路由选择?这实际上取决于您的应用程序 RabbitMQ在发送消息方面很聪明,因此它只会在以下情况下向集群中的节点发送消息: 保存该消息的队列驻留在该节点或节点上 如果消费者已连接到该节点并已请求该消息 通常,

假设您有一个由3个节点组成的小型rabbitmq系统,该系统应能在同一个交换机中处理100多个相当大的容量队列。假设队列只存在于创建它们的节点上(我们不使用复制的高可用性队列),那么创建队列的最佳方法是什么?将队列分布在集群节点之间有什么好处吗?还是最好将它们都放在一个节点上,并由rmq进行路由选择?

这实际上取决于您的应用程序

RabbitMQ在发送消息方面很聪明,因此它只会在以下情况下向集群中的节点发送消息:

  • 保存该消息的队列驻留在该节点或节点上
  • 如果消费者已连接到该节点并已请求该消息
  • 通常,您应该在发布者和队列的使用者将连接到的节点上声明队列。换句话说,您应该将发布者和使用者连接到保存他们使用的队列的节点。这假设您正试图节省总体使用的带宽

    如果您正在使用集群来提高吞吐量(可能是这样),并且您不关心使用的内部带宽,那么您应该以平衡的方式将发布者/消费者连接到节点,而不必担心内部路由机制


    最后要考虑的是内存和磁盘空间。队列将消息存储在主内存中,如果内存不足,则回退到磁盘。因此,如果在一个位置声明所有队列,将导致一个节点“工作过度”,两个节点有空闲内存。

    作为我正在处理的应用程序中实现冗余和故障切换的一部分,我刚刚完成了在代理后面设置RabbitMQ群集,并让我的所有发布者和消费者通过代理进行连接,代理将robins连接发送到从客户机传入的各个节点。在将RabbitMQ升级到2.7.1之前,这似乎相当均匀地将队列分配到各个节点,尽管这当然很大程度上取决于代理如何平衡请求以及客户端何时尝试连接(并声明队列)


    说到这里,我刚刚升级到RabbitMQ 2.7.1,这非常轻松,并为我们提供了HA队列,这对我们的应用程序来说是一个巨大的胜利。无论如何,如果您对该设置感兴趣,并且认为它对您的队列问题有好处,我很乐意与您分享该设置。

    “鉴于队列只存在于创建它们的节点上,”-在HA集群中,它们会复制到每个节点,不是吗?(对不起,上面一半的评论都被打断了!)嘿,史蒂夫,对不起,我不清楚。我们目前不使用HA队列,因为它们直到rmq的更高版本才被引入。将更新问题以使其更具体。感谢您的输入,scvalex。我喜欢在发布服务器和订阅服务器都要连接的节点上创建队列的想法。然而,这对我们来说有点困难,因为我们有一个队列变量,必须通过发布者和订阅者都知道的某种散列算法将队列分配给节点。答案很好。你能举出一些关于吞吐量和内部带宽的权衡以及一个节点的过度工作的资源吗?我很想听听你的设置。我正在写一篇博客文章来描述这个设置,但它一直被推迟,因为需要扑灭其他火焰,哈哈。不过我没有忘记这一点,很快将再次更新。我也有兴趣了解您的设置:)