当系统需要高性能以及扩展性的时候,单个broker已经不满足我们的需求了,我们可以把多个broker连接起来,来达到我们需要的效果。ActiveMQ支持双向的网络连接通道,如下图所示
多个broker之间的连接,有两种方式,一个是静态网络连接,一个是动态网络连接。
ActiveMQ提供了多种协议,配置transportConnectors的时候,根据不同的协议配置uri,比如:
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,格式如下:
static:(uri1,uri2,uri3,...)?key=value
transportConnectors是用于client-to-broker,networkConnectors是用于broker-to-broker。
参数上图的例子,我们做以下配置:
61616的activemq.xml配置,指向61618:
<transportConnectors> <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> </transportConnectors> <networkConnectors> <networkConnector uri="static:(tcp://localhost:61618)" /> </networkConnectors>
61618的activemq.xml配置,指向61616和61619(另外jetty.xml中port改8162):
<transportConnectors> <transportConnector name="openwire" uri="tcp://0.0.0.0:61618?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> </transportConnectors> <networkConnectors> <networkConnector uri="static:(tcp://localhost:61616,tcp://localhost:61619)" /> </networkConnectors>
61619的activemq.xml配置(另外jetty.xml中port改8163)
<transportConnectors> <transportConnector name="openwire" uri="tcp://0.0.0.0:61619?maximumConnections=1000&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可以被处理。 |