【问题标题】:RabbitMQ clustering modelRabbitMQ 集群模型
【发布时间】:2015-01-20 12:56:52
【问题描述】:

让我们考虑下面的场景。

在集群模型中部署了 3 个 RabbitMQ 代理(B1、B2、B3)。有一个带有绑定的交换 E,它被复制到所有 3 个代理。有一个生产者 P 和 3 个消费者 C1,C2,C3。我有以下问题

  1. 假设生产者连接到代理 B1 并创建一个镜像到 B2 的队列 Q。现在当消费者连接到 Broker B3 时,它如何获取队列中的消息?

  2. 据我了解,交换和绑定信息保存在每个代理的内存中。如果交换是持久的,为了从broker崩溃中恢复,交换和绑定信息是否也在所有broker的磁盘中持久化?

  3. 如果整个队列都维护在所有镜像代理的内存中,它会消耗代理中的大量内存。为了支持潜在的大量队列,每个队列在每个代理中都包含数百万条消息,这不是对可伸缩性的限制吗?

【问题讨论】:

    标签: rabbitmq message-queue amqp


    【解决方案1】:
    1. 每个镜像队列都有一个主节点。该队列的主节点始终用于消费。所以当消费者连接到一个没有队列存储(或者是从节点)的节点时,消费者实际上最终会从主节点消费。

    2. 是的,假设节点是磁盘节点而不是 RAM 节点。我不是 100% 确定绑定,但我的猜测是肯定的。无论如何,强烈建议始终声明您的客户需要的所有队列、交换等! (每次客户端启动时都这样做)

    3. 是的,这就是镜像的重点:添加冗余以防出现问题。它不会提高性能(相反!)。但总的来说,包含数百万条消息的队列并不是一个好的情况,因为队列平均应该是空的

    【讨论】:

    • 第三项的好点。排队服务器不应该充当应用程序其余部分的巨大缓冲区 - 相反,它应该促进整个应用程序功能并且通常是空的。
    • @Martin:第一点,当你说消费者最终会从主节点消费时,代理是否处理与主节点的对话?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多