我有两个使用联合插件配置[1]的代理。两者都指向彼此为上游。
我的测试是:
结果是:
我想要的结果是:
当消费者在代理B上消费消息时,如何配置RabbitMQ从所有队列中弹出消息?现在我正在尝试使用RabbitMQ Federation插件。
[1]两个经纪人互相指向上游,我将它们配置为same way as described in the "simple example" given by the documentation,只是有两个经纪人互相指向上游。 code for the publisher looks like this和code for the consumer looks like this。
答案 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。
一条消息将同时出现在代理A和B中,每个代理一个副本,彼此独立。换句话说,例如,即使在经纪人B将消息传递给其使用者之后,该消息的另一个副本仍保留在经纪人A中。
优势:您将始终拥有该消息的两个副本,每个代理中都有一个副本,该副本高度可用。
缺点:您需要将一个消费者与每个经纪人联系起来。
一条消息将最终出现在两个代理之一中。默认情况下,已发布消息的代理将优先排队。但是,如果只有另一个经纪人有消费者,则消息将移至另一个经纪人。
消息最终位于哪个代理无关紧要,消息将仅由连接到任何一个代理的使用者一次传递一次。
优势:该消息只会一次发送一次,仅发送给连接到任何一个经纪人的消费者。
缺点:该消息只有一个副本。如果收到消息的代理发生故障,则其他代理将无法获得消息。但是,如果最终一致性很好,则此选项可以。原因是当有问题的代理重新运行时,该消息最终将可用。
在这种情况下,一条消息将最终出现在两个代理中,每个代理一个副本。相同的消息将两次发送给连接到任何一个代理的使用者。邮件两次发送后,将在两个代理中消失。 (如果有两个消费者,每个经纪人连接一个消费者,则每个经纪人将一次向其消费者传递相同的消息。)
优势:消费者可以连接到任何一个代理,每个代理中的消息将被传递和出队。
缺点:同一封邮件将被发送两次。解决方法是,在处理消息之前,检查是否已处理相同的消息。
注意:
这并不意味着哪个选项比另一个更好。这完全取决于您的用例,还有许多其他配置可以发挥作用,这可能会改变行为。