ActiveMQ笔记(3):基于Networks of Brokers的HA方案

上一篇介绍了基于ZK的ActiveMQ HA方案,虽然理解起来比较容易,但是有二个不足:

1)  占用的节点数过多,1个zk集群至少3个节点,1个activemq集群也至少得3个节点,但其实正常运行时,只有一个master节点在对外响应,换句话说,花6个节点的成本只为了保证1个activemq master节点的高可用,太浪费资源了。

2)  性能下降太明显,比起单节点的activemq,性能下降了近1个数量级。

这一篇将介绍基于networks of brokers的HA方案,不需要借助zk等第3方组件,只需要2个activemq节点就能达到类似效果,进入正题之前,先来简单谈谈Broker这个概念。

Broker一词的原意是『经纪人、中间人』,用在ActiveMQ的构架中,即:Broker作为Producer与Consumer的中间人(或代理人),生产者不用知道消费者在哪里、如何消费这些细节,只要将消息扔给中间人Broker即可,类似的,消费者也不用关心消息是从哪个生产者过来的,它只知道这是从Broker那里拿来的,如果画一张图来描述,就是下面这样(引用自本文最后参考文章中的图片)

那么,当生产者将消息发给Broker时,会发生什么?下图描述的就是这个过程:

1) 生产者将消息发给Broker

2) Broker将消息落地存储

3) 然后给生产者反馈:事情我已经办妥了!

继续,再来看看消费者又是如何跟Broker打交道的:

1) Broker将接收到的消息,从db中取出

2) 然后发送给消费者

3) 如果消费者使用的是自动确认模式(即:Session.AUTO_ACKNOWLEDGE),则Consumer会马上告诉Broker:ok,消息我已经收到了。

4) 然后进行自己的业务处理

5) Broker一旦收到确认,将会马上更新消息的状态为已消费(或直接删除,取决于持久化的实现机制)(注:虽然图中步骤5排在步骤4之后,但是步骤4、5几乎是同时发生的)

在一些大型应用中,如果一个Broker出现性能瓶颈抗不住压力,可能会拆分成多个Broker,如下图所示:

(注:上图中箭头的方法并非数据流向,而应该理解成调用关系,即:Producer调用Broker1,Consumer调用Broker2...)

Producer将消息发送给Broker1,而Consumer从另一个Broker2接收消息,有点类似数据库读写分离的意思,这样系统的性能可以提升一定程度的提升,但是问题来了,Broker1上的消息,如何同步到Broker2呢,这就依赖networkConnector的配置。

 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="activemq-1">
14     <networkConnectors>
15       <networkConnector uri="static:(tcp://127.0.0.1:61626)"/>
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:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
23     </transportConnectors>
24   </broker>
25
26   <import resource="jetty.xml"/>
27 </beans>

注意:14-16行及21-22行,该Broker对外暴露61616端口,同时"连接"到61626端口(即另1个broker),最终的效果相当于,如果有producer把消息发到61616(broker1),则从另一个broker(61626端口)上也能消费这条消息。

明白这些基本原理后,在61626对应的activemq上,也做类似的配置,只不过"连接方向"正好相反,参考以下配置:

 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="activemq-2">
14         <networkConnectors>
15             <networkConnector uri="static:(tcp://127.0.0.1:61616)"/>
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:61626?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
23         </transportConnectors>
24     </broker>
25
26     <import resource="jetty.xml"/>
27 </beans>

(注:如果希望2个activemq上都能访问admin管理界面,jetty.xml中的端口要修改,不要冲突)

这样,activemq-1与activemq-2这二个broker就互为主备,发给你的消息会同步到我,发给我的消息也会同步到你,实现了HA,示意图如下:

Producer与Consumer连接到activemq时,配置文件可以这么写:

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)"/>
6             ...
7         </bean>
8     </property>
9 </bean>

这种HA方案的优点是占用的节点数更少(只需要2个节点),而且2个broker都可以响应消息的接收与发送,性能比zookeeper方案要好一些。

参考文章:

http://www.jakubkorab.net/2011/11/understanding-activemq-broker-networks.html

http://activemq.apache.org/networks-of-brokers.html

时间: 2024-10-13 06:06:02

ActiveMQ笔记(3):基于Networks of Brokers的HA方案的相关文章

centos activemq 集群配置 Networks of Brokers

1.安装JDK运行环境  #cd /opt  #wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u112-b15/jdk-8u112-linux-x64.tar.gz  #tar zxvf jdk-8u112-linux-x64.tar.gz  

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

上一篇介绍了基于Networks of Borkers的2节点HA方案,这一篇继续来折腾Networks of Brokers,当应用规模日渐增长时,2节点的broker可能仍然抗不住访问压力,这时候就需要多加一些broker,弄一个更大规模的Broker集群,但是怎么合理设置broker之间的网络桥接,却是有讲究的,先来看一种不太好的设计: 这个架构看上去没瑕疵,没毛病,3个broker之间两两互通,整体可用性极高,但是从消息的路由角度来看,却不是一个好的设计,当producer向broker

ActiveMQ笔记:一个高稳定,可扩展的的部署方案

本文介绍一个笔者在实际工作中的实施的基于ActiveMQ的一个高稳定,可扩展的异步消息系统. ActiveMQ是一个成熟的基于Java语言的开源消息系统,在实际应用中被大量使用.ActiveMQ在系统稳定性,系统的容错和扩展等方面都有很多成熟的方案,也有很多开源的管理工具,是部署异步消息系统的一个很好的选择. ActiveMQ工作机制 ActiveMQ有两种消息使用方式: l  Queue模式:Producer发出到Queue里的消息,只能由一个Consumer来使用. l  Topic模式:P

《Essential C++》读书笔记 之 基于对象编程风格

<Essential C++>读书笔记 之 基于对象编程风格 2014-07-13 4.1 如何实现一个class 4.2 什么是Constructors(构造函数)和Destructors(析构函数) 4.3 何谓mutable(可变)和const(不变) 4.4 什么是this指针 4.5 Static Class Member(静态的类成员) 4.6 打造一个Iterator Class 4.7 合作关系必须建立在友谊的基础上 4.8 实现一个copy assignment operat

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效 热度 13728 2015-7-11 23:34 |个人分类:蛋哥的学习笔记之-基于Unity的Shader编程| 音乐, Unity, Shader, 水波, Shader, Shader, Shader, Shader 一.要干些啥: 很久很久没有写文档了,前段时间做了个个人很喜欢的,自认为比较原创的小特效,所以写个文档纪念下(本人特别喜欢音乐) 思路其实很简单,首先用顶点着色器实现一般的水波特效,然后解析音频数据(我

nginx学习笔记之基于端口的虚拟主机基于主机名的虚拟主机root、alias、index配置

nginx学习笔记之基于端口的虚拟主机基于主机名的虚拟主机root.alias.index配置 实验环境: centos 测试节点IP:172.16.3.101 基于端口的虚拟主机: vim /etc/nginx/nginx.conf # 向里面的http {}里面加入如下内容   server { # server定义一个虚拟主机         listen 8080; # 监听本机所有IP端口8080         server_name www.test.com; # 虚拟主机名为:w

《BI项目笔记》基于雪花模型的维度设计

原文:<BI项目笔记>基于雪花模型的维度设计 GBGradeCode 外键关系: 1 烟叶等级 T_GBGradeCode.I_DistinctionID=T_Distinction.I_DistinctionID 烟叶等级分为:上等烟.中等烟.下等烟.末等烟.低等烟.低次等烟.其它.下低等烟 2 分级标准 T_GBGradeCode.I_GradStanCode=T_GradeStandard.I_GradStanCode 取值为:四十二级.二十八级.自定义.其他.工艺级别 3 烟叶烤型 T

论文笔记 《Maxout Networks》 &amp;&amp; 《Network In Network》

论文笔记 <Maxout Networks> && <Network In Network> 发表于 2014-09-22   |   1条评论 出处 maxout:http://arxiv.org/pdf/1302.4389v4.pdfNIN:http://arxiv.org/abs/1312.4400 参考 maxout和NIN具体内容不作解释下,可以参考:Deep learning:四十五(maxout简单理解)Network In Network 各用一句话

嵌入式Linux学习笔记(基于S5PV210 TQ210)

基于S5PV210.TQ210平台. 本文更多的是教会大家如何学习! 包括如下内容: 1.前言 2.开发环境搭建 3.制作交叉编译器 4.裸机编程 4.1.汇编学习 4.2.S5PV210启动流程 4.3.点亮一个LED 4.4.串口 4.5.实现printf 4.6.时钟配置 4.7.重定位 4.8.DDR 4.9.NAND读写 4.11.LCD操作 5.移植u-boot(基于u-boot-2014.4版本) 5.1.概述 5.2.u-boot配置过程分析 5.3.u-boot编译过程分析 5