activemq
如果要实现扩展性和高可用性的要求的话,就需要用到网络连接模式。简单来说就是将多个
broker
实例连接,作为一个服务对外提供连接。
NetworkConnector
主要用来配置broker
与broker
之间的通信连接,提供了两种连接方式:静态网络连接和动态网络连接
这里我使用两台
broker
作为示例
172.18.109.177
172.18.109.179
静态网络连接
修改activemq.xml
增加NetworkConnector
配置
<networkConnectors>
<networkConnector uri="static://(tcp://172.18.109.177:61616,tcp://172.18.109.179:61616)"/>
</networkConnectors>
向172.18.109.177
发送三条消息
可以看到,在 172.18.109.177
上接收了三条消息等待消费。 172.18.109.179
上没有消息。
在172.18.109.179
上接收三条消息,并确认
可以看到,原来在 172.18.109.177
上的三条消息,被转移到172.18.109.179
上了,并且被消费确认。现在两台broker
上均没有可以消费的消息。
消息的丢失
一些consumer
连接到broker1
、消费broker2
上的消息。消息先被broker1
从broker2
消费掉,然后转发给这些consumers
。假设,转发消息的时候broker1
重启了,这些consumers
发现brokers1
连接失败,通过failover
连接到broker2
.但是因为有一部分没有消费的消息被broker2
已经分发到broker1
上去了,这些消息就好像消失了。除非有消费者重新连接到broker1
上来消费。
从5.6版本开始,在destinationPolicy
上新增了一个选项replayWhenNoConsumers
属性,这个属性可以用来解决当broker1
上有需要转发的消息但是没有消费者时,把消息回流到它原始的broker
。同时把enableAudit
设置为false
,为了防止消息回流后被当作重复消息而不被分发
通过如下配置,在activeMQ.xml
中。 分别在两台服务器都配置。即可完成消息回流处理
<policyEntry queue=">" enableAudit="false">
<networkBridgeFilterFactory>
<conditionalNetworkBridgeFilterFactory replayWhenNoConsumers="true" />
</networkBridgeFilterFactory>
</policyEntry>
重启broker
服务。
动态网络连接
随着broker
数量的增多,activemq.xml
里配置静态网络连接就会非常麻烦。这种情况下就可以使用动态网络连接实现broker
的发现机制。通过使用multicast
组播的形式实现动态网络连接,开放一个组播的IP
地址各个broker
向其发送消息通知其是存活的。
这种场景会消耗一定的网络资源。
容错的连接
在创建连接工厂的时候,可以通过failover
来指定消费端的负载均衡,默认会连接第一个。当第一个服务挂掉之后,默认会随机进行其他可用服务的选择。达到高可用。
ConnectionFactory factory = new ActiveMQConnectionFactory(
"failover(tcp://172.18.109.179:61616,tcp://172.18.109.177:61616)"
);