AMQP重试连接如何与故障转移一起工作?

时间:2018-07-18 15:57:13

标签: java jms messaging amqp qpid

我找不到有关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);
  • 是是否在每个故障转移URI上都应用了failover.maxReconnectAttempts(即将对第一个URI重试20次,如果未成功重新连接,将在第二个URI上再尝试20次;对我来说,需要说明的是,默认最大重新连接值为-1,客户端将无限期地在第一个URI上重试,因此故障转移逻辑将永远不会到达第二个URI),或者在两个URI上都是轮循式的(即在第一个URI上重试一次,然后在第二个URI上重试一次,然后返回第一个URI,依此类推……总共进行20次重试)?我当然会对此进行测试,但是这种行为在官方标准中得到了解释吗?

  • 鉴于客户端正在发送或接收消息,并且host1上的代理存在连接问题,是否还会重试发送或接收操作?我希望重试基础连接,但是,不确定发送或接收操作会发生什么。如果未自动重试发送/接收,则意味着在发送/接收的级别上必须有另一个重试逻辑(我认为这不太可能)。和以前一样,这是在官方标准中记录的吗?

1 个答案:

答案 0 :(得分:2)

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

故障转移重试逻辑已在v0.26.0左右进行了全面改进,现在更加健壮和可预测,因此您确实应该尽快升级到最新版本0.35.0

发送和接收处理的工作方式因连接断开的过程而异。在大多数情况下,发送将被重试,但是在一些小的时间范围内,您可能会收到异常消息,表明发送失败。对于接收而言,事情变得更加困难,因为当连接断开时,由远程方来决定未解决的传递会发生什么,这是在权限范围之内的。

即使在使用故障转移时,您也需要处理JMS异常并实践良好的编码方法,因为没有完全透明的故障转移之类的东西,并且您需要做好应对意外情况的准备。