ActiveMQ笔记(4):搭建Broker集群(cluster)

简介: 上一篇介绍了基于Networks of Borkers的2节点HA方案,这一篇继续来折腾Networks of Brokers,当应用规模日渐增长时,2节点的broker可能仍然抗不住访问压力,这时候就需要多加一些broker,弄一个更大规模的Broker集群,但是怎么合理设置broker之间的网络...

上一篇介绍了基于Networks of Borkers的2节点HA方案,这一篇继续来折腾Networks of Brokers,当应用规模日渐增长时,2节点的broker可能仍然抗不住访问压力,这时候就需要多加一些broker,弄一个更大规模的Broker集群,但是怎么合理设置broker之间的网络桥接,却是有讲究的,先来看一种不太好的设计:

 

这个架构看上去没瑕疵,没毛病,3个broker之间两两互通,整体可用性极高,但是从消息的路由角度来看,却不是一个好的设计,当producer向broker1发送一条消息时,Consumer得到消息的路径可能有如下2条:

a) producer -> broker1 -> broker2 

b) producer -> broker1 -> broker3 -> broker2  

当broker更多时,情况会更复杂,比如下面这张图:

消息的路由途径将会更多:

a) producer -> broker1 -> broker4

b) producer -> broker1 -> broker2 -> broker4

c) producer -> broker1 -> broker2 -> broker3 -> broker4

d) producer -> broker1 -> broker3 -> broker4

不难想像,每多经过一个节点,消息处理的延时将会增加一些,如果Broker越多,情况越复杂,最终系统对外表现为消息处理有时很快,有时很慢,整体性能很不稳定,所以实际生产中,不要采用所有Broker之间两两互连的方案

合理的方案如下:

这张图的灵感,应该来自组建局域网中的星形网络,在中心放置一个Borker充当Hub,与其它所有Broker互连,这样不管Consumer连接到外围的哪个Broker,消息的路由途径都比较稳定(最多经过3个Broker),这种架构性能虽然稳定了,但是中心的Hub就变成单点隐患,如果中间的DockerHub挂了,整个系统也就废了。

改进后的架构如下:

本质上仍然是一个星形网络,只不过将hub弄成二个互备,然后每个hub都与其它外围的broker相连,消费者连接到broker1/broker2/broker3,生产者(Producer)连接到hub1/hub2,消息的最长路径不超过3个broker (注:生产者也可以连接到broker1/2/3,与消费者一样,但是消息经过的最长路径会变成4)

如果以后要扩张,比如增加了Broker4,Broker5...,直接修改hub1/2上的配置,增加与新的broker的连接即可,不影响消息的路由途径长度。

最后,在本机演练一把,给出一些配置示例:

1、端口规划

activemq1: 61616 (broker1)
activemq2: 61626 (broker2)
activemq3: 61636 (broker3)
activemq4: 61646 (broker-hub1)
activemq5: 61656 (broker-hub2)

共5个activemq实例,端口61616、61626、61636为broker1、broker2、broker3,61645、61656为broker-hub1、broker-hub2

2、activemq.xml配置

以boker1为例,配置文件内容如下:

 1 <beans
 2         xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 5   http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
 6 
 7   <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 8     <property name="locations">
 9       <value>file:${activemq.conf}/credentials.properties</value>
10     </property>
11   </bean>
12 
13   <broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker1">  
14     <persistenceAdapter>
15       <kahaDB directory="${activemq.data}/kahadb"/>
16     </persistenceAdapter>
17     <transportConnectors>
18       <transportConnector name="openwire"
19                           uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
20     </transportConnectors>
21   </broker>
22 
23   <import resource="jetty.xml"/>
24 </beans>
View Code

broker2及broker3,大家参考该配置修改端口号及brokerName即可。

broker-hub1的配置:

 1 <beans
 2         xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 5   http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
 6 
 7   <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 8     <property name="locations">
 9       <value>file:${activemq.conf}/credentials.properties</value>
10     </property>
11   </bean>
12 
13   <broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-hub1">
14     <networkConnectors>
15       <networkConnector uri="static:(tcp://127.0.0.1:61656,tcp://127.0.0.1:61616,tcp://127.0.0.1:61626,tcp://127.0.0.1:61636)" duplex="true"/>      
16     </networkConnectors>
17     <persistenceAdapter>
18       <kahaDB directory="${activemq.data}/kahadb"/>
19     </persistenceAdapter>
20     <transportConnectors>
21       <transportConnector name="openwire"
22                           uri="tcp://0.0.0.0:61646?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
23     </transportConnectors>
24   </broker>
25 
26   <import resource="jetty.xml"/>
27 </beans>
View Code

broker-hub2的配置:

 1 <beans
 2         xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 5   http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
 6 
 7   <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 8     <property name="locations">
 9       <value>file:${activemq.conf}/credentials.properties</value>
10     </property>
11   </bean>
12 
13   <broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-hub2">
14     <networkConnectors>   
15       <networkConnector uri="static:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61626,tcp://127.0.0.1:61636)" duplex="true"/>
16     </networkConnectors>
17     <persistenceAdapter>
18       <kahaDB directory="${activemq.data}/kahadb"/>
19     </persistenceAdapter>
20     <transportConnectors>
21       <transportConnector name="openwire"
22                           uri="tcp://0.0.0.0:61656?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
23     </transportConnectors>
24   </broker>
25 
26   <import resource="jetty.xml"/>
27 </beans>
View Code

3、java代码中spring配置文件

a) 生产者

 1 <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
 2     <property name="connectionFactory">
 3         <bean class="org.apache.activemq.ActiveMQConnectionFactory">
 4             <!--broker服务的地址-->
 5             <property name="brokerURL" value="failover:(tcp://localhost:61646,tcp://localhost:61656)"/>
 6             <!--默认值为1000,如果不需要这么大,可以调小-->
 7             <property name="maxThreadPoolSize" value="100"/>
 8             <!--<property name="userName" value="system"/>-->
 9             <!--<property name="password" value="manager"/>-->
10         </bean>
11     </property>
12 </bean>
View Code

b) 消费者

 1 <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
 2     <property name="connectionFactory">
 3         <bean class="org.apache.activemq.ActiveMQConnectionFactory">
 4             <!--broker服务的地址-->
 5             <property name="brokerURL" value="failover:(tcp://localhost:61616,tcp://localhost:61626,tcp://localhost:61636)"/>
 6             <!--默认值为1000,如果不需要这么大,可以调小-->
 7             <property name="maxThreadPoolSize" value="100"/>
 8             <!--<property name="userName" value="system"/>-->
 9             <!--<property name="password" value="manager"/>-->
10         </bean>
11     </property>
12 </bean>
View Code

 

目录
相关文章
|
3月前
|
消息中间件 存储 Kafka
Kafka【环境搭建 02】kafka_2.11-2.4.1 基于 zookeeper 搭建高可用伪集群(一台服务器实现三个节点的 Kafka 集群)
【2月更文挑战第19天】Kafka【环境搭建 02】kafka_2.11-2.4.1 基于 zookeeper 搭建高可用伪集群(一台服务器实现三个节点的 Kafka 集群)
170 1
|
3月前
|
安全 Java API
Zookeeper(持续更新) VIP-02 Zookeeper客户端使用与集群特性
2,/usr/local/data/zookeeper-3,/usr/local/data/zookeeper-4,在每个目录中创建文件。创建四个文件夹/usr/local/data/zookeeper-1,/usr/local/data/zookeeper-Follower:只能处理读请求,同时作为 Leader的候选节点,即如果Leader宕机,Follower节点。己对外提供服务的起始状态。E: 角色, 默认是 participant,即参与过半机制的角色,选举,事务请求过半提交,还有一个是。
|
3月前
|
缓存 Java API
Zookeeper(持续更新) VIP-02 Zookeeper客户端使用与集群特性
Curator 是一套由netflix 公司开源的,Java 语言编程的 ZooKeeper 客户端框架,Curator项目是现在ZooKeeper 客户端中使用最多,对ZooKeeper 版本支持最好的第三方客户端,并推荐使用,Curator 把我们平时常用的很多 ZooKeeper 服务开发功能做了封装,例如 Leader 选举、分布式计数器、分布式锁。这就减少了技术人员在使用 ZooKeeper 时的大部分底层细节开发工作。
|
3月前
|
消息中间件 监控 Kafka
深入理解 Kafka 集群搭建与管理
Apache Kafka 作为分布式流处理平台的核心,其集群搭建与管理是确保高可用性和高性能的关键。本文将深入研究 Kafka 集群的构建、配置、工作原理、节点角色以及一些高级管理策略,以助力大家更深层次地理解和灵活运用 Kafka 集群。
|
10月前
|
消息中间件 分布式计算 网络协议
服务搭建篇(六) 搭建基于Kafka + Zookeeper的集群
用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容 易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的 接口提供给用户使用。
165 0
|
消息中间件 Kafka Apache
Kafka3.0集群部署(内附zookeeper3.5.7集群部署)
Kafka3.0集群部署(内附zookeeper3.5.7集群部署)
162 0
|
消息中间件 运维 监控
Kafka两种集群详解和搭建教程
Kafka两种集群详解和搭建教程
3913 0
Kafka两种集群详解和搭建教程
|
消息中间件 存储 缓存
RabbitMQ 部署及配置详解(集群部署)
RabbitMQ 部署及配置详解(集群部署)
1075 0
|
存储 负载均衡 NoSQL
分布式部署:第一章:zookeeper集群和solrcloud及redisCluster集群搭建
分布式部署:第一章:zookeeper集群和solrcloud及redisCluster集群搭建
229 0
|
存储 NoSQL 5G
集群-cluster 集群搭建|学习笔记
快速学习集群-cluster 集群搭建
144 0
集群-cluster 集群搭建|学习笔记