2

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

我的测试是:

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

结果是:

  • 在经纪人 B 上消费作品
  • <good> broker B 上的队列弹出消息
  • <不好> broker A 上的队列还有消息
    • <这不好的原因> 我看到的问题是:如果我总是在一个代理上发布,然后总是在另一个代理上消费 --> 那么发布代理上的队列将增长直到它满了并开始丢弃消息。

我想要的结果是:

  • 当消费者在代理 B 上消费时,代理 A 和 B 上的两个队列都会弹出消息

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


[1] 这两个代理作为上游相互指向,我按照文档给出的“简单示例”中描述的相同方式配置它们,除了有两个代理作为上游相互指向。发布者的代码看起来像这样,消费者的代码看起来像这样。

4

2 回答 2

2

我创建了这个环境:

服务器 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)。

这可以按您的预期工作。

希望能帮助到你。

于 2015-11-12T08:33:42.970 回答
1

@Trevor Boyd Smith,您可以考虑如下所示的选项 2 或 3。

选项 1:双向联合交易所

一条消息将在代理 A 和 B 中结束,每个代理复制一份,彼此独立。换句话说,例如,即使在代理 B 已将消息传递给其消费者之后,该消息的另一个副本仍保留在代理 A 中。

优点:您将始终拥有两份消息副本,每个代理一份,这是高度可用的。

缺点:您需要有一个消费者连接到每个代理。

选项 2:双向联合队列

一条消息将最终到达两个代理之一。默认情况下,已经发布消息的broker会优先将消息入队;但是,如果只有另一个代理有消费者,则消息将移动到另一个代理。

消息最终在哪个代理中无关紧要,消息将仅由连接到任一代理的消费者一次且一次地传递。

优点:消息将一次且仅一次传递给连接到任一代理的消费者。

缺点:消息只会有一份副本。如果得到消息的broker宕机了,其他broker就无法获取消息了。但是,如果您对最终的一致性感到满意,那么这个选项就可以了。原因是当有问题的代理恢复运行时,消息最终将可用。

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

在这种情况下,一条消息将在两个代理中结束,每个代理一个副本。相同的消息将被传递给连接到任一代理的消费者,两次!一旦消息被传递两次,它将在两个代理中消失。(如果有两个消费者,一个连接到每个代理,每个代理将向其消费者传递一次相同的消息。)

在此处输入图像描述

优点:消费者可以连接任意一个broker,每个broker中的消息都会被投递和出队。

缺点:相同的消息将被传递两次。解决方法是,在处理消息之前,检查是否已经处理了相同的消息。

笔记:

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

于 2020-04-25T14:31:09.327 回答