上一篇介绍了基于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对外暴露6166端口,同时"连接"到6166端口(即另1个broker),最终的效果相当于,如果有producer把消息发到6166(broker1),则从另一个broker(6166端口)上也能消费这条消息。

明白这些基本原理后,在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方案要好一些。

最后,再给一个简化配置的技巧,以上述的2节点HA方案中,二个activemq的配置文件都要加networkConnector配置,如果想减轻配置的工作量,也可以只在其中一个activemq设置,参考以下片段:

    <networkConnectors>
<networkConnector uri="static:(tcp://127.0.0.1:61626)" duplex="true"/>
</networkConnectors>

即:在61616这个activemq的配置文件中,添加networkConnector时,增加duplex="true",也就是双工通讯的意思,这样61616与61626这二个activemq上的broker就建立了双向通讯连接,另一个activemq上就无需额外配置了(注:如果在61626上配置了,反而会报错)

参考文章:

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

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

基于Networks of Brokers的HA方案的更多相关文章

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

    上一篇介绍了基于ZK的ActiveMQ HA方案,虽然理解起来比较容易,但是有二个不足: 1)  占用的节点数过多,1个zk集群至少3个节点,1个activemq集群也至少得3个节点,但其实正常运行时 ...

  2. ActiveMQ笔记(2):基于ZooKeeper的HA方案

    activemq官网给出了3种master/slave的HA方案,详见:http://activemq.apache.org/masterslave.html,基于共享文件目录,db,zookeepe ...

  3. 基于使用ISCSI存储的ibmmq通过heartbeat实现HA方案以及碰到的问题总结

    一.背景 ibmmq是一种传统架构的mq产品,运行稳定,有其自身优点,但在高可用(HA)这一块需要使用公司根据自身需求选用高可用(HA)产品,但由于市面HA商业产品较贵,所以使用linux操作系统级的 ...

  4. 【大数据安全】基于Kerberos的大数据安全验证方案

    1.背景 互联网从来就不是一个安全的地方.很多时候我们过分依赖防火墙来解决安全的问题,不幸的是,防火墙是假设"坏人"是来自外部的,而真正具有破坏性的攻击事件都是往往都是来自于内部的 ...

  5. Hadoop HA方案调研

    原文成文于去年(2012.7.30),已然过去了一年,很多信息也许已经过时,不保证正确,与Hadoop学习笔记系列一样仅为留做提醒. ----- 针对现有的所有Hadoop HA方案进行调研,以时间为 ...

  6. Zabbix 6.0:原生高可用(HA)方案部署

    Blog:博客园 个人 本部署文档适用于CentOS 8.X/RHEL 8.X/Anolis OS 8.X/AlmaLinux 8.X/Rockey Linux 8.X. 原生的HA方案终于来了 相比 ...

  7. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  8. MySQL基于时间字段进行分区的方案总结

    MySQL支持的分区类型一共有四种:RANGE,LIST,HASH,KEY.其中,RANGE又可分为原生RANGE和RANGE COLUMNS,LIST分为原生LIST和LIST COLUMNS,HA ...

  9. 一种基于Orleans的分布式Id生成方案

    基于Orleans的分布式Id生成方案,因Orleans的单实例.单线程模型,让这种实现变的简单,贴出一种实现,欢迎大家提出意见 public interface ISequenceNoGenerat ...

随机推荐

  1. openssl 对称加密算法enc命令详解

    1.对称加密算法概述 openssl的加密算法库提供了丰富的对称加密算法,我们可以通过openssl提供的对称加密算法指令的方式使用,也可以通过调用openssl提供的API的方式使用. openss ...

  2. .net中用到的一些方法

    //文件操作string fullDirPath = Utils.GetMapPath(string.Format("/aspx/{0}/", buildPath)); Direc ...

  3. js 代码命名规范系列

    在微博上看到一个段子 “老子哪天出任ceo迎娶白富美走上人生巅峰之后,一定要雇两个长腿大熊的妹子.一个帮我想变量名字,一个帮我想git commit的message!” 可以看出 命名方方面面的问题困 ...

  4. The run destination XXX的 iPhone is not valid for Running the scheme 'Day7通讯录Demo'.

    错误:

  5. CSS 设计彻底研究(一)(X)HTML与CSS核心基础

    第1章 (X)HTML与CSS核心基础 这一章重点介绍了4个方面的问题.先介绍了 HTML和XHTML的发展历程以及需要注意的问题,然后介绍了如何将CSS引入HTML,接着讲解了CSS的各种选择器,及 ...

  6. 图的割点 桥 双连通(byvoid)

    [点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...

  7. php web qq第三方登录

    官方api地址:http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-01.去qq互联上注册申请成为开发者,并创 ...

  8. 利用7z实现一键解压

    目的: 实现双击zip,7z,rar等文件时自动解压,解压完毕后自动打开文件夹. 工具: [本文末尾附有所有工具的下载地址] 7z.exe types 步骤: 新建"7z-自动解压" ...

  9. JSTL: empty 可以减少很多繁冗的判空(转)

    ${empty student.name }Empty是判空为空返回的真不为空返回的是假 ${(empty student.name)? '空' : '非空'} <c:if test=" ...

  10. onclick事件

    onclick = "func(this);"----------->传递element对象 onclick = "func(event);"------ ...