备忘用
消息的存储三种方式 : kahaDB ,levelDB,数据库。
(1) kahaDB 可以通过文件共享来实现 高可用,需要对linux进行配置,这里不做具体介绍。
(2)levelDB 是 activeMq 支持的一种高可用策略 ,需要搭建至少三个(奇数个)节点的zk集群 ,我们的activeMq 也是需要三个。
(3)基于数据库实现activeMq高可用 。
(4)通过负载可以实现“高可用”,缺陷是,挂掉的mq 中积压的消息,只能等他恢复,才能继续消费(半可用)。
负载实现
静态网络连接 & 动态网络连接 :
两个mq 的配置文件中,分别配置静态网络连接标签,uri=static 分别指向对方的ip 。这样他们之间可以互相消费,除此之外我们还需配置消息回流,这样 brokerA 的消费者去消费 队列 queueMsg时 , brokerA 没有回去brokerB要,当 brokerB 的消费者去消费 队列 queueMsg 时,brokerB 会从 brokerA中要回来,就这样互相来回消费。
弊端 : 当brokerA要到queueMsg 队列上的消息时宕机了,该消息只能等brokerA恢复了在提供给消费者们。
<!--静态网络连接-->
<networkConnectors>
<networkConnector uri="static:(tcp://127.0.0.1:61617)" />
</networkConnectors>
<!--动态网络连接,用的较少-->
<networkConnectors>
<networkConnector uri="multicast://default" name="bridge" dynamicOnly="false" conduitSubscriptions="true" decreaseNetworkConsumerPriority="false">
</networkConnectors>
配置好后, 我们在客户端通过 : failover 来进行对两个 mq 的连接,randomize\=true 我们客户端会随机对brokerA,brokerB 进行连接,当 brokerA宕机了,他会将所有的连接都打在brokerB上 。 randomize\=false , 所有的客户端连接都会打在第一个ip:port 上,只有第一个挂了,他才会打在第二个mq 上。
mq.property 文件
mq.brokerURL=failover\:(tcp\://47.3.4.60\:61616,tcp\://47.13.12.16\:61616)?randomize\=true&initialReconnectDelay\=1000&maxReconnectDelay\=30000
spring-mq.xml 文件
<bean id="targetConnectionFactory"class="org.apache.activemq.ActiveMQConnectionFactory">
<!-- ActiveMQ服务地址 -->
<property name="brokerURL" value="${mq.brokerURL}" />
<property name="userName" value="${mq.userName}"></property>
<property name="password" value="${mq.password}"></property>
</bean>
mysql 实现高可用
说明 :客户端连接同上 。
在两个(以上)mq 的配置文件中(activeMq.xml) 修改如下配置 :
修改 persistenceAdapter
<persistenceAdapter>
<!--kahadb 存储-->
<!--<kahaDB directory="${activemq.data}/kahadb_slavor"/> -->
<!--mysql 存储-->
<jdbcPersistenceAdapter useDatabaseLock="true" dataSource="#mysql-ds"/>
</persistenceAdapter>
<!--mysql 前 加 缓存-->
<persistenceFactory>