ActiveMQ故障转移传输

故障转移传输层重新连接任何其他传输器之上的逻辑。配置语法允许您指定任意数量的复合URI。故障转移传输随机选择一个复合URI,并尝试建立与之的连接。如果它不成功,或者如果随后失败,则从列表中随机选择一个其他URI,建立一个新的连接。

 

配置语法

failover:(uri1,...,uriN)?transportOptions&nestedURIOptions

要么

failover:uri1,...,uriN

 

例:

failover:(tcp:// localhost:61616,tcp:// remotehost:61616)?initialReconnectDelay = 100
运输选项

选项名称

默认值

描述

backup

false

初始化并保持第二个传输连接 - 启用快速故障转移。

initialReconnectDelay

10

第一次重新连接尝试之前的延迟(以ms为单位)。

maxCacheSize

131072

跟踪消息缓存的大小(字节)。

适用前提trackMessagestrue

maxReconnectAttempts

-1 | 0

从ActiveMQ 5.6:默认是-1,永远重试。0意味着禁用重新连接,例如:只尝试连接一次。
在ActiveMQ 5.6之前:默认是0,永远重试。
所有ActiveMQ版本:一个值>0表示将错误发送回客户端之前的重新连接尝试的最大次数。

maxReconnectDelay

30000

第二次和随后的重新连接尝试之间的最大延迟(以毫秒为单位)

nested.*

null

从ActiveMQ 5.9:将应用于列表中每个URI的常用URI选项

randomize

true

如果true,从列表中随机选择一个用于重新连接的URI。

reconnectDelayExponent

2.0

在指数退避尝试期间使用的指数。

reconnectSupported

true

确定客户端是否应该使用重新连接来响应代理ConnectionControl事件(请参阅:)rebalanceClusterClients

startupMaxReconnectAttempts

-1

-1表示启动时的连接尝试次数应为无限制。

值  >=0 表示启动时重新连接尝试的次数,当客户端进行后续重新连接尝试时,将发送错误发送回客户端。

注意:一旦成功连接,该maxReconnectAttempts选项占优势。

timeout

-1

从ActiveMQ 5.3:设置发送操作的超时(以毫秒为单位),而不会中断重连接进程。 

trackMessages

false

保留在重新连接时刷新到代理的快速消息。

updateURIsSupported

true

从ActiveMQ 5.4:确定客户端是否应该接受从代理到其已知URI列表的更新。

updateURIsURL

null

从ActiveMQ 5.4:到文本文件的URL(或本地文件的路径),该文本文件包含在出现故障时用于重新连接的逗号分隔的URI列表。

useExponentialBackOff

true

如果true在重新连接尝试之间使用指数退避。

warnAfterReconnectAttempts

10

从ActiveMQ 5.10:一个值>0指定在记录警告之前的重新连接尝试的次数。记录的警告表示没有当前连接,但正在尝试重新连接。

<=0禁用对重新连接尝试的警告记录的值。 

 

使用随机化

默认情况下,故障切换传输随机选择一个URI。这有效地平衡了多个经纪人的客户端。但是,要使客户端连接到主服务器,并且仅在主服务器不可用时才连接到辅助备用代理程序randomize=false

例:

failover:(tcp:// primary:61616,tcp:// secondary:61616)?randomize = false
笔记

在故障转移传输发送操作下,默认情况下,当代理变得不可用时,将无限期地阻止。有两个可用于处理此方案的选项。首先,无论是设置一个TransportListener上直接ActiveMQConnectionFactory,使其处于适当位置,可能需要一个网络跳或第二,设置任何请求之前timeout选择。该timeout选项使当前发送操作在指定的超时后失败。

例:

故障转移:(tcp:// primary:61616)?timeout = 3000

在此示例中,如果连接未建立,则发送操作将在3秒后超时。重要的是要注意,当超时发生时连接不会被杀死。因此,有可能在经纪人变得可用后再次使用相同的连接重新发送受影响的消息。

交易

默认情况下,故障转移传输跟踪事务。重新连接时重播飞行中的交易。对于简单的情况,这可以按预期方式工作。然而,关于确认(或消费者)交易存在一种假设,因为先前接收到的消息将在重新连接时自动重播。然而,当有许多连接和消费者时,这并不总是正确的,因为重新发送订单不能保证,因为陈旧的确认可能会干扰新传递的消息。这可能导致未确认的消息。

从ActiveMQ 5.3.1:跟踪重新发送顺序如果在故障切换后未重新传递未完成的消息,则事务将无法提交。javax.jms.TransactionRolledBackException如果提交失败,则抛出A。有疑问的交易将导致回滚,以便可以由应用程序重播。当提交消息在飞行中时,发生故障转移时,会发生疑难事务。不可能知道确切的故障点。发生故障是因为事务提交消息未传递或提交回复丢失?在任一情况下,有必要回滚事务,以便应用程序可以获得失败的指示并处理任何潜在的问题。

用于故障切换的代理端选项

从ActiveMQ 5.4:  TransportConnector有可用的选项,以便代理可以自动更新客户机,以了解有关可用(或不再可用)故障转移的新代理商的存在的信息。

选项是:

选项名称

默认值

描述

updateClusterClients

false

如果  true将关于代理集群拓扑变化的信息传递给连接的客户端。

rebalanceClusterClients

false

如果true连接的客户端将被要求在一群新经纪人加入经纪人网络时重新平衡一些经纪人(注意:  priorityBackup=true可以覆盖)。

updateClusterClientsOnRemove

false

如果true,当从网络中删除集群时,将更新客户端。将此作为单独的选项可以让客户在新经纪人加入时更新,而不是在经纪人离职时更新。

updateClusterFilter

null

逗号分隔的正则表达式过滤器列表,用于匹配经纪人的代理名称,以指定为客户端的故障转移群集的一部分。

例:

< broker >
   ...
   < transportConnectors >
     < transportConnector name = "openwire" uri = "tcp://0.0.0.0:61616" updateClusterClients = "true" updateClusterFilter = ".*A.*,.*B.*" />
   </< transportConnectors >
   ...
</ broker >

updateClusterClients=true客户端只需要配置集群中的一个代理的详细信息才能连接。

例:

故障转移:(tcp:// primary:61616)

当新经纪人加入群集时,客户端将被自动通知新代理的URI。当其他已知代理商之一变得不可用时,新的URI可用于故障转移。

附加信息

请参阅以下博客条目,了解如何使用群集客户端更新和重新平衡功能,标题为 ActiveMQ 5.4中的 新功能:自动群集更新和重新平衡
优先备份

从ActiveMQ 5.6:如果经纪人在本地和远程网络都可用,可以使用priorityBackuppriorityURIs选项指定对远程代理的本地代理的偏好。

考虑以下URL:

failover:(tcp:// local:61616,tcp:// remote:61616)?randomize = false&priorityBackup = true

给定此URL,客户端将尝试连接并保持与local代理的连接。如果local经纪人失败,当然会失败  remote。但是,由于priorityBackup使用参数,客户端将不断尝试重新连接 local。一旦客户端可以这样做,客户端将重新连接到它,而不需要手动干预。

默认情况下,只有列表中的第一个URI被认为是优先级(local)。在大多数情况下,这将足够。然而,在某些情况下,可能需要有多个“本地”URI。该priorityURIs选项可用于指定将哪些URI视为优先级。

例:

failover:(tcp:// local1:61616,tcp:// local2:61616,tcp:// remote:61616)?randomize = false&priorityBackup = true&priorityURIs = tcp:// local1:61616,tcp:// local2:61616

在这种情况下,客户端将优先考虑任何一方local1local2经纪人,并(如果可用)重新连接它们。

配置嵌套URI选项。

从ActiveMQ 5.9:通用URI选项可以通过将它们附加到故障转移URI的查询字符串中进行配置,其中每个常用URI选项都有前缀:nested. 

示例 - 而不是这样做:

failover:(tcp:// broker1:61616?wireFormat.maxInactivityDuration = 1000,tcp:// broker2:61616?wireFormat.maxInactivityDuration = 1000,tcp:// broker3:61616?wireFormat.maxInactivityDuration = 1000) 

做这个:

failover:(tcp:// broker1:61616,tcp:// broker2:61616,tcp:// broker3:61616)?nested.wireFormat.maxInactivityDuration = 1000
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值