ActiveMQ中有一个概念:networks of brokers,它指的是连接ActiveMQ的消息代理在一起形成不同的拓扑结构。 简单的说,就是通过把多个不同的broker实例连接在一起,作为一个整体对外提供服务,从而提高整体对外的消息服务能力。通过这种方式连接在一起的broker实例之间,可以共享队列和消费者列表,从而达到分布式队列的目的。在http://blog.csdn.net/zuolj/article/details/53116439一文的第二小节详述了network机制,这章记录我在单机上部署一个networks of brokers 集群。
部署的架构图为:
broker之间的通过静态发现(static discovery)和动态发现(dynamic discovery)来维持彼此发现,两种机制的配置方式在《ActiveMQ的集群与高可用》中介绍了过了。这里,我们选用动态发现机制进行配置
三个broker的配置均为:
<networkConnectors>
<networkConnector name="defalut" uri="multicast://default"/>
</networkConnectors>
由于networks of brokers使用共享存储的方式实现高可用,这里,我们选用基于共享文件存储的kahaDB存储机制。
所以三个broker的持久化存储配置为:
<persistenceAdapter>
<kahaDB directory="/home/activemq/activemq_data/kahadb"
enableIndexWriteAsync="true"
enableJournalDiskSyncs="false"/>
</persistenceAdapter>
networks of brokers的集群配置中,与zookeeper+leveDB集群配置不一样的是,这里每一个broker实例,都应该有不同的brokerName,这里我把三个实例的brokerName配置为broker1、broker2、broker3.
然后,三个broker的监控端口和传输端口都要修改成不一致(如果是不同机器上启动的三个broker,那么这一步就不需要考虑了),这里,我的配置和《ActiveMQ单机部署zookeeper+levelDB集群》一致。
依次启动三个broker
[user@broker1] sudo ./activemq start
[user@broker2] sudo ./activemq start
[user@broker3] sudo ./activemq start
这里,networks of brokers集群的高可用性是通过共享文件系统的锁机制实现的,先抢到锁的broker对外服务,所以,打开三个broker的监控界面,目前只有broker1的监控是可行的。
尝试关闭broker1,其他两个broker之一会自动启动。
现在,用producer生产2000个消息到这个networks集群,正在工作的broker监控上可以看到pending messages:2000,Messages Enqueued:2000,队列名称:TEST.FOO
关闭正在服务的broker(我这里是broker3),broker1抢到文件锁,打开传输端口和网络端口,监控broker1的界面
pending messages:2000
Messages Enqueued:0
队列名称:TEST.FOO
继续生产1000个消息发到同一个队列
pending messages:3000
Messages Enqueued:1000
队列名称:TEST.FOO
继续关闭这个broker,broker2启动服务
pending messages:3000
Messages Enqueued:0
队列名称:TEST.FOO
启动消费者去消费
pending messages:0
Messages Enqueued:0
Number of Consumers:1
队列名称:TEST.FOO