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);
是否在每个故障转移 URI 上应用 failover.maxReconnectAttempts(即,将在第一个 URI 上重试 20 次,如果重新连接不成功,将在第一个 URI 上再尝试 20 次第二个 URI;对我来说,这里需要注意的是,默认的最大重新连接值为 -1,客户端将无限期地重试第一个 URI,因此故障转移逻辑永远不会到达第二个 URI),或者它是圆形的 - robin 在两个 URI 上(即在第一个 URI 上重试一次,然后在第二个 URI 上也重试一次,然后返回到第一个,等等......总共重试 20 次)?我当然会对此进行测试,但是,官方标准中是否解释了这种行为?
假设客户端正在发送或接收消息,并且host1上的代理存在连接问题,是否也会重试发送或接收操作?我希望重试底层连接,但是不确定发送或接收操作会发生什么。如果 send/receive 没有自动重试,这意味着必须在 send/receive 级别上有另一个重试逻辑(我觉得这不太可能)。同上,官方标准中有记载吗?
没有关于 AMQP 客户端如何管理故障转移的规范定义行为,因此它会因一种实现而异。对于 Qpid JMS 的过时版本,我认为您正在使用客户端(我想不起来了)将每次尝试连接到远程 URI 视为一次不同的尝试,因此如果您配置的连接尝试少于 URI,则可能会错过 URI .
故障转移重试逻辑在 v0.26.0 左右进行了大修,现在更加健壮和可预测,因此您真的应该很快转移到最新版本 0.35.0
发送和接收处理的工作方式因连接断开的进程中的位置而异。大多数情况下,发送将被重试,但有少数 windows 的时间您可能会收到指示发送失败的异常。对于接收来说,事情更加困难,因为当连接断开时,由远程决定未结算的交付会发生什么,它有权将消息发送到其他地方。
即使在使用故障转移时,您也需要处理 JMS 异常并练习良好的编码方法,因为没有完全透明的故障转移之类的东西,您需要准备好在意外发生时做出反应。
我找不到关于 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 次第二个 URI;对我来说,这里需要注意的是,默认的最大重新连接值为 -1,客户端将无限期地重试第一个 URI,因此故障转移逻辑永远不会到达第二个 URI),或者它是圆形的 - robin 在两个 URI 上(即在第一个 URI 上重试一次,然后在第二个 URI 上也重试一次,然后返回到第一个,等等......总共重试 20 次)?我当然会对此进行测试,但是,官方标准中是否解释了这种行为?
假设客户端正在发送或接收消息,并且host1上的代理存在连接问题,是否也会重试发送或接收操作?我希望重试底层连接,但是不确定发送或接收操作会发生什么。如果 send/receive 没有自动重试,这意味着必须在 send/receive 级别上有另一个重试逻辑(我觉得这不太可能)。同上,官方标准中有记载吗?
没有关于 AMQP 客户端如何管理故障转移的规范定义行为,因此它会因一种实现而异。对于 Qpid JMS 的过时版本,我认为您正在使用客户端(我想不起来了)将每次尝试连接到远程 URI 视为一次不同的尝试,因此如果您配置的连接尝试少于 URI,则可能会错过 URI .
故障转移重试逻辑在 v0.26.0 左右进行了大修,现在更加健壮和可预测,因此您真的应该很快转移到最新版本 0.35.0
发送和接收处理的工作方式因连接断开的进程中的位置而异。大多数情况下,发送将被重试,但有少数 windows 的时间您可能会收到指示发送失败的异常。对于接收来说,事情更加困难,因为当连接断开时,由远程决定未结算的交付会发生什么,它有权将消息发送到其他地方。
即使在使用故障转移时,您也需要处理 JMS 异常并练习良好的编码方法,因为没有完全透明的故障转移之类的东西,您需要准备好在意外发生时做出反应。