gpt4 book ai didi

java - 您如何使用 RabbitMQ java 客户端库处理从故障连接中恢复的问题?

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:32 25 4
gpt4 key购买 nike

我很想知道其他人如何使用官方 RabbitMQ Java 客户端库处理从故障连接中恢复的问题。我们正在使用它来将我们的应用程序服务器连接到我们的 RabbitMQ 集群,并且我们已经实现了几种不同的方法来从连接失败中恢复,但没有一种感觉很正确。

想象一下这个伪应用程序:

public class OurClassThatStartsConsumers {
Connection conn;

public void start() {
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername("someusername");
factory.setPassword("somepassword");
factory.setHost("somehost");
conn = factory.newConnection();

new Thread(new Consumer(conn.createChannel())).start();
}
}

class Consumer1 implements Runnable {
public Consumer1(Channel channel) {
this.channel = channel;
}

@Override
public void run() {
while (true) {
... consume incoming messages on the channel...
// How do we handle that the connection dies?
}
}
}

在现实世界中,我们有数百个消费者。那么如果连接断开会发生什么?在上面的例子中,Consumer1 无法恢复,当连接关闭时,Channel 也关闭,这是一种我们无法恢复的状态。那么让我们看看一些解决这个问题的方法:

解决方案 A)

让每个消费者都有自己的连接并注册连接断开时触发的事件,然后处理重新连接。

优点:有效

缺点:

  • 由于我们有很多消费者,我们可能不需要那么多连接。
  • 我们可能有很多重复的代码重新连接到兔子并处理重新连接

解决方案 B)

让每个消费者使用相同的连接并订阅它的连接失败事件。

优点:连接比解决方案 A 少

缺点:由于连接已关闭,我们需要重新打开/替换它。 Java 客户端库似乎没有提供重新打开连接的方法,所以我们必须用新连接替换它,然后以某种方式通知所有消费者这个新连接,他们将不得不重新创建 channel 和消费者.再一次,很多我不想在消费者身上看到的逻辑最终都在那里。

解决方案 C)

Wrap ConnectionChannel 类是处理重新连接逻辑的类,消费者只需要知道WrappedChannel 类。在连接失败时,WrappedConnection 将处理重新建立连接,一旦连接,WrappedConnection 将自动创建新 channel 并注册消费者。

优点:有效 - 这实际上是我们今天使用的解决方案。

缺点:感觉像是 hack,我认为这应该由底层库更优雅地处理。

也许有更好的方法? API 文档并没有过多讨论如何从故障连接中恢复。任何输入表示赞赏:)

最佳答案

从 3.3.0 版本开始,您可以使用自动恢复,这是 Java 客户端的一项新功能。来自 Java API 指南 ( http://www.rabbitmq.com/api-guide.html#recovery )

To enable automatic connection recovery, use factory.setAutomaticRecovery(true):

关于java - 您如何使用 RabbitMQ java 客户端库处理从故障连接中恢复的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19695897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com