AMQP 重试连接如何与故障转移一起使用?

How does AMQP retry connection work with failover?

我找不到关于 JMS 客户端重新连接如何与故障转移逻辑一起工作的明确文档。 我查阅了以下官方文档,与我使用的版本相对应:

JMS 客户端指定以下 URI 进行故障转移和重试:

String uri = new String("failover:(amqp://host1:5672,amqp://host2:5672)?&failover.maxReconnectAttempts=20");
javax.jms.ConnectionFactory connectionFactory = new org.apache.qpid.jms.JmsConnectionFactory(uri);

没有关于 AMQP 客户端如何管理故障转移的规范定义行为,因此它会因一种实现而异。对于 Qpid JMS 的过时版本,我认为您正在使用客户端(我想不起来了)将每次尝试连接到远程 URI 视为一次不同的尝试,因此如果您配置的连接尝试少于 URI,则可能会错过 URI .

故障转移重试逻辑在 v0.26.0 左右进行了大修,现在更加健壮和可预测,因此您真的应该很快转移到最新版本 0.35.0

发送和接收处理的工作方式因连接断开的进程中的位置而异。大多数情况下,发送将被重试,但有少数 windows 的时间您可能会收到指示发送失败的异常。对于接收来说,事情更加困难,因为当连接断开时,由远程决定未结算的交付会发生什么,它有权将消息发送到其他地方。

即使在使用故障转移时,您也需要处理 JMS 异常并练习良好的编码方法,因为没有完全透明的故障转移之类的东西,您需要准备好在意外发生时做出反应。