RabbitMQ:双向联合经纪人,你如何使所有队列弹出消息?

时间:2015-11-09 23:22:40

标签: python rabbitmq messagebroker rabbitmq-federation

我有两个使用联合插件配置[1]的代理。两者都指向彼此为上游。

我的测试是:

  • 在经纪人A上发布消息
  • 消费经纪人B

结果是:

  • 消费经纪人B工作
  • <好>代理B上的队列弹出消息
  • <不好>代理A上的队列仍然有消息
    • <为什么这不好>我看到的问题是:如果我总是在一个经纪人上发布然后总是在另一个经纪人身上消费 - >然后,发布代理上的队列将会增长,直到它完整并开始丢弃消息。

我想要的结果是:

  • 当消费者在经纪人B消费时,经纪人A和B上的两个队列都会弹出他们的消息

当消费者在代理B上消费消息时,如何配置RabbitMQ从所有队列中弹出消息?现在我正在尝试使用RabbitMQ Federation插件。

[1]两个经纪人互相指向上游,我将它们配置为same way as described in the "simple example" given by the documentation,只是有两个经纪人互相指向上游。 code for the publisher looks like thiscode for the consumer looks like this

2 个答案:

答案 0 :(得分:1)

我创建了这个环境:

服务器A,服务器B.

以这种方式创建双向联合:

联邦上游:Server_B = amqp://servera

联邦上游:Server_A = amqp://serverb

然后在两台服务器上创建了相同的策略:

Pattern : ^fed\.
Apply to: all   
federation-upstream-set:all

为服务器A创建了一个名为fed.test1的队列,然后向服务器B创建了一个消费者:

 ConnectionFactory factory = new ConnectionFactory();
 factory.setHost("localhost");
 factory.setPort(5673);
 Connection connection = factory.newConnection();
 Channel channel = connection.createChannel();


Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
                        throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Message   '" + message );
                }
            };
channel.basicConsume("fed.test1",  true, consumer);

然后向服务器A发布消息---> fed.test1

消息已被消耗给服务器B,并且队列消息计数为zero两个队列(服务器A,服务器B)。

这可以按预期工作。

希望它有所帮助。

答案 1 :(得分:1)

@Trevor Boyd Smith,也许您会考虑如下所示的选项2或3。

选项1:双向联盟交换

一条消息将同时出现在代理A和B中,每个代理一个副本,彼此独立。换句话说,例如,即使在经纪人B将消息传递给其使用者之后,该消息的另一个副本仍保留在经纪人A中。

优势:您将始终拥有该消息的两个副本,每个代理中都有一个副本,该副本高度可用。

缺点:您需要将一个消费者与每个经纪人联系起来。

选项2:双向联合队列

一条消息将最终出现在两个代理之一中。默认情况下,已发布消息的代理将优先排队。但是,如果只有另一个经纪人有消费者,则消息将移至另一个经纪人。

消息最终位于哪个代理无关紧要,消息将仅由连接到任何一个代理的使用者一次传递一次。

优势:该消息只会一次发送一次,仅发送给连接到任何一个经纪人的消费者。

缺点:该消息只有一个副本。如果收到消息的代理发生故障,则其他代理将无法获得消息。但是,如果最终一致性很好,则此选项可以。原因是当有问题的代理重新运行时,该消息最终将可用。

选项3:双向联合交换和队列

在这种情况下,一条消息将最终出现在两个代理中,每个代理一个副本。相同的消息将两次发送给连接到任何一个代理的使用者。邮件两次发送后,将在两个代理中消失。 (如果有两个消费者,每个经纪人连接一个消费者,则每个经纪人将一次向其消费者传递相同的消息。)

enter image description here

优势:消费者可以连接到任何一个代理,每个代理中的消息将被传递和出队。

缺点:同一封邮件将被发送两次。解决方法是,在处理消息之前,检查是否已处理相同的消息。

注意:

这并不意味着哪个选项比另一个更好。这完全取决于您的用例,还有许多其他配置可以发挥作用,这可能会改变行为。