ActiveMQ 静态网络连接

当系统需要高性能以及扩展性的时候,单个broker已经不满足我们的需求了,我们可以把多个broker连接起来,来达到我们需要的效果。ActiveMQ支持双向的网络连接通道,如下图所示
image.png
多个broker之间的连接,有两种方式,一个是静态网络连接,一个是动态网络连接。

静态网络连接

ActiveMQ提供了多种协议,配置transportConnectors的时候,根据不同的协议配置uri,比如:

1
2
3
4
uri="tcp://0.0.0.0:61616"
uri="amqp://0.0.0.0:5672"
uri="stomp://0.0.0.0:61613"
uri="mqtt://0.0.0.0:1883"

静态网络协议,配置跟上面差不多,前面是static,后面跟的是上面的各种uri,格式如下:

1
static:(uri1,uri2,uri3,...)?key=value

transportConnectors是用于client-to-broker,networkConnectors是用于broker-to-broker。

例子

参数上图的例子,我们做以下配置:
61616的activemq.xml配置,指向61618:

1
2
3
4
5
6
<transportConnectors>    
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
<networkConnectors>
<networkConnector uri="static:(tcp://localhost:61618)" />
</networkConnectors>

61618的activemq.xml配置,指向61616和61619(另外jetty.xml中port改8162):

1
2
3
4
5
6
<transportConnectors>    
<transportConnector name="openwire" uri="tcp://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
<networkConnectors>
<networkConnector uri="static:(tcp://localhost:61616,tcp://localhost:61619)" />
</networkConnectors>

61619的activemq.xml配置(另外jetty.xml中port改8163)

1
2
3
<transportConnectors>    
<transportConnector name="openwire" uri="tcp://0.0.0.0:61619?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

java代码中:
Consumer61616连接61616,Consumer61618连接61618,Consumer61619连接61619。
Producer61616连接61616,Producer61618连接61618。
Producer61616发送6条消息,Consumer61616和Consumer61618各消费3条。
Producer61618发送6条消息,Consumer61616、Consumer61618和Consumer61619各消费2条。

配置值

URL的属性配置:

属性 默认值 描述
initialReconnectDelay 1000 重连之前等待的时间(ms) (如果useExponentialBackOff为 false)
maxReconnectDelay 30000 重连之前等待的最大时间(ms)
useExponentialBackOff true 每次重连失败时是否增大等待时间
backOffMultiplier 2 增大等待时间的系数

networkConnecto属性配置

属性 默认值 描述
name bridge 名称
dynamicOnly false 如果为true, 持久订阅被激活时才创建对应的网路持久订阅。默认是启动时激活。
decreaseNetworkConsumerPriority false 设定消费者优先权,如果为true,网络的消费者优先级降低为-5。如果为false,则默认跟本地消费者一样为0。
networkTTL 1 消息和订阅在网络上通过的broker数量。
messageTTL 1 网络中用于消息的broker数量。
consumerTTL 1 网络中用于消费的broker数量。
conduitSubscriptions true 多个网络消费者是否被当做一个消费者来对待。(在做集群的时候如果有多个consumer,需要设置为false)
excludedDestinations empty 不通过网络转发的destination。
dynamicallyIncludedDestinations empty 通过网络转发的destinations,注意空列表代表所有的都转发。
staticallyIncludedDestinations empty 匹配的都将通过网络转发-即使没有对应的消费者。
duplex false 设置是否能双向通信
prefetchSize 1000 设置网络消费者的prefetch size参数。必须大于0,因为网络消费者不能自己轮询消息。
suppressDuplicateQueueSubscriptions false (从5.3版本开始) 如果为true, 重复的订阅关系一产生即被阻止。
bridgeTempDestinations true 是否广播advisory messages来创建临时destination。
alwaysSyncSend false (从 5.6版本开始) 如果为true,非持久化消息也将使用request/reply方式代替oneway方式发送到远程broker。
staticBridge false (从5.6版本开始) 如果为true,只有staticallyIncludedDestinations中配置的destination可以被处理。