ActiveMQ部署方案分析对比-精选版-精心整理
ActiveMQ的作用总结(应用场景及优势)以及springboot+activeMq实战
ActiveMQ的作⽤总结(应⽤场景及优势)以及springboot+activeMq实战业务场景说明:消息队列在⼤型电⼦商务类⽹站,如京东、淘宝、去哪⼉等⽹站有着深⼊的应⽤,队列的主要作⽤是消除⾼并发访问⾼峰,加快⽹站的响应速度。
在不使⽤消息队列的情况下,⽤户的请求数据直接写⼊数据库,在⾼并发的情况下,会对数据库造成巨⼤的压⼒,同时也使得系统响应延迟加剧。
在使⽤队列后,⽤户的请求发给队列后⽴即返回,(例如: 当然不能直接给⽤户提⽰订单提交成功,京东上提⽰:您“您提交了订单,请等待系统确认”),再由消息队列的消费者进程从消息队列中获取数据,异步写⼊数据库。
由于消息队列的服务处理速度远快于数据库,因此⽤户的响应延迟可得到有效改善。
图解说明:1. 消息队列说明消息队列中间件是分布式系统中重要的组件,主要解决应⽤耦合,异步消息,流量削锋等问题。
实现⾼性能,⾼可⽤,可伸缩和最终⼀致性架构。
是⼤型分布式系统的中间件。
⽬前在⽣产环境,使⽤较多的消息队列有,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。
2. 消息队列应⽤场景消息队列在实际应⽤中常⽤的使⽤场景。
异步处理,应⽤,流量削锋和消息通讯四个场景。
2.1. 异步处理场景说明:⽤户注册后,需要发注册邮件和注册短信。
传统的做法有两种1.串⾏的⽅式;2.并⾏⽅式。
(1)串⾏⽅式:将注册信息写⼊成功后,发送注册邮件,再发送注册短信。
以上三个任务全部完成后,返回给客户端。
(2)并⾏⽅式:将注册信息写⼊成功后,发送注册邮件的同时,发送注册短信。
以上三个任务完成后,返回给客户端。
与串⾏的差别是,并⾏的⽅式可以提⾼处理的时间。
假设三个业务节点每个使⽤50毫秒钟,不考虑⽹络等其他开销,则串⾏⽅式的时间是150毫秒,并⾏的时间可能是100毫秒。
因为CPU在单位时间内处理的请求数是⼀定的,假设CPU1秒内吞吐量是100次。
则串⾏⽅式1秒内CPU可处理的请求量是7次(1000/150)。
关于ActiveMQ、RocketMQ、RabbitMQ、Kafka一些总结和区别
关于ActiveMQ、RocketMQ、RabbitMQ、Kafka⼀些总结和区别这是⼀篇分享⽂为什么写这篇⽂章?博主有两位朋友分别是⼩A和⼩B:1. ⼩A,⼯作于传统软件⾏业(某社保局的软件外包公司),每天⼯作内容就是和产品聊聊需求,改改业务逻辑。
再不然就是和运营聊聊天,写⼏个SQL,⽣成下报表。
⼜或者接到客服的通知,某某功能故障了,改改数据,然后下班部署上线。
每天过的都是这种⽣活,技术零成长。
2. ⼩B,⼯作于某国企,虽然能接触到⼀些中间件技术。
然⽽,他只会订阅/发布消息。
通俗点说,就是调调API。
对为什么使⽤这些中间件啊?如何保证⾼可⽤啊?没有充分的认识。
庆幸的是两位朋友都很有上进⼼,于是博主写这篇⽂章,帮助他们复习⼀下关于消息队列中间件这块的要点复习要点本⽂⼤概围绕如下⼏点进⾏阐述:1. 为什么使⽤?2. 使⽤消息队列有什么缺点?3. 如何选型?4. 如何保证消息队列是⾼可⽤的?5. 如何保证消息不被重复消费?6. 如何保证消费的可靠性传输?7. 如何保证消息的顺序性?我们围绕以上七点进⾏阐述。
需要说明⼀下,本⽂不是《消息队列从⼊门到精通》这种课程,因此只是提供⼀个复习思路,⽽不是去教你们怎么调⽤消息队列的API。
建议对消息队列不了解的⼈,去找点消息队列的博客看看,再看本⽂,收获更⼤正⽂1、为什么要使⽤?分析:⼀个⽤消息队列的⼈,不知道为啥⽤,这就有点尴尬。
没有复习这点,很容易被问蒙,然后就开始胡扯了。
回答:这个问题,咱只答三个最主要的应⽤场景(不可否认还有其他的,但是只答三个主要的),即以下六个字:解耦、异步、削峰(1)解耦传统模式:传统模式的缺点:系统间耦合性太强,如上图所⽰,系统A在代码中直接调⽤系统B和系统C的代码,如果将来D系统接⼊,系统A还需要修改代码,过于⿇烦!中间件模式:中间件模式的的优点:将消息写⼊消息队列,需要消息的系统⾃⼰从消息队列中订阅,从⽽系统A不需要做任何修改。
(转)关于ActiveMQ的配置
(转)关于ActiveMQ的配置⽬前常⽤的消息队列组建⽆⾮就是MSMQ和ActiveMQ,⾄于他们的异同,这⾥不想做过多的⽐较。
简单来说,MSMQ内置于微软操作系统之中,在部署上包含⼀个隐性条件:Server需要是微软操作系统。
(对于这点我并去调研过MSMQ是否可以部署在⾮微软系统,⽐如:Linux,只是拍脑袋想了想,感觉上是不可以)。
对于ActiveMQ,微软系统和Linux都是可以部署的。
从功能⽅⾯来说,⼀般最常⽤的就是:消息的收/发,感觉差异不⼤。
从性能上来说,⼀般的说法是ActiveMQ略⾼。
在稳定性上,个⼈感觉MSMQ更好。
如果这两种常⽤队列都⽤过的同学,应该来说最⼤的差异在于:MSMQ如果要访问远程队列(⽐如机器A上的程序访问机器B上的队列),会⽐较恶⼼。
在数据量⽐较⼤的情况之下,⼀般来说队列服务器会专门的⼀台或者多台(多台的话,⽤程序去做热备+负载⽐较⽅便,也不需要额外的硬件成本。
简单来说做法可以这样:消息发送的时候随机向着多台队列服务器上发送消息;接受的时候开多个线程去分别监听;热备⽅⾯,可以维护⼀个带状态的队列连接池,如果消息收发失败那么将状态置为不可⽤,然后起⼀个线程去定时监测坏的连接是否可⽤,这个过程⼀般情况下可以不⽤加锁,为什么,⼤家根据各⾃需要去取舍吧)。
最近搞完了短彩信的⽹关连接服务,这两种队列我均使⽤了。
⼤致的过程是这样的:上层应⽤如果要发端彩信,那么将消息直接发送⾄ActiveMQ(⽬前⽤的就是上⾯说的多台热备+负载,因为实际中下⾏量⾮常⼤5千万条/天以上),然后端彩信⽹关连接服务部署多套,每套均依赖本机的MSMQ。
为什么呢?⽤ActiveMQ的原因是:上层应⽤程序和⽹关连接服务彼此独⽴,消息需要跨机访问。
⽤MSMQ的原因是:ActiveMQ中的数据是⼀条不分省的⼤队列,⽹关连接服务需要按省流控,所以端彩信⽹关连接服务:⾸先把消息从ActiveMQ取出来,然后存⾄本机上的分省MSMQ,这样做另外的⼀个好处就是:ActiveMQ不⾄于过多挤压,他的数据会分摊到N台短彩信⽹关连接服务所部署的机器上的MSMQ之中,也就说MSMQ可以起到分摊数据和缓冲的作⽤。
[MQ]关于ActiveMQ的配置
[MQ]关于ActiveMQ的配置转自:/CopyPaster/archive/2012/04/27/24731 79.html目前常用的消息队列组建无非就是MSMQ和ActiveMQ,至于他们的异同,这里不想做过多的比较。
简单来说,MSMQ 内置于微软操作系统之中,在部署上包含一个隐性条件:Server需要是微软操作系统。
(对于这点我并去调研过MSMQ 是否可以部署在非微软系统,比如:Linux,只是拍脑袋想了想,感觉上是不可以)。
对于ActiveMQ,微软系统和Linux 都是可以部署的。
从功能方面来说,一般最常用的就是:消息的收/发,感觉差异不大。
从性能上来说,一般的说法是ActiveMQ略高。
在稳定性上,个人感觉MSMQ更好。
如果这两种常用队列都用过的同学,应该来说最大的差异在于:MSMQ如果要访问远程队列(比如机器A上的程序访问机器B上的队列),会比较恶心。
在数据量比较大的情况之下,一般来说队列服务器会专门的一台或者多台(多台的话,用程序去做热备+负载比较方便,也不需要额外的硬件成本。
简单来说做法可以这样:消息发送的时候随机向着多台队列服务器上发送消息;接受的时候开多个线程去分别监听;热备方面,可以维护一个带状态的队列连接池,如果消息收发失败那么将状态置为不可用,然后起一个线程去定时监测坏的连接是否可用,这个过程一般情况下可以不用加锁,为什么,大家根据各自需要去取舍吧)。
最近搞完了短彩信的网关连接服务,这两种队列我均使用了。
大致的过程是这样的:上层应用如果要发端彩信,那么将消息直接发送至ActiveMQ (目前用的就是上面说的多台热备+负载,因为实际中下行量非常大5千万条/天以上),然后端彩信网关连接服务部署多套,每套均依赖本机的MSMQ。
为什么呢?用ActiveMQ 的原因是:上层应用程序和网关连接服务彼此独立,消息需要跨机访问。
用MSMQ的原因是:ActiveMQ中的数据是一条不分省的大队列,网关连接服务需要按省流控,所以端彩信网关连接服务:首先把消息从ActiveMQ取出来,然后存至本机上的分省MSMQ,这样做另外的一个好处就是:ActiveMQ不至于过多挤压,他的数据会分摊到N台短彩信网关连接服务所部署的机器上的MSMQ之中,也就说MSMQ可以起到分摊数据和缓冲的作用。
activeMQ集群的使用与配置
Clustering(集群)ActiveMQ从多种不同的方面提供了集群的支持。
1、Queue consumer clustersActiveMQ支持订阅同一个queue的consumers上的集群。
如果一个consumer 失效,那么所有未被确认(unacknowledged)的消息都会被发送到这个queue上其它的consumers。
如果某个consumer的处理速度比其它consumers更快,那么这个consumer就会消费更多的消息。
需要注意的是,笔者发现AcitveMQ5.0版本的Queue consumer clusters存在一个bug:采用AMQ Message Store,运行一个producer,两个consumer,并采用如下的配置文件:那么经过一段时间后可能会报出如下错误:ERROR[ActiveMQTransport:tcp:///127.0.0.1:1843-RecoveryListenerAdapter.java:58-RecoveryListenerAdapter] Message id ID:versus-1837-1203915536609-0:2:1:1:419 could not be recovered from the data store!Apache官方文档说,此bug已经被修正,预定在5.1.0版本上体现。
2、Broker clusters一个常见的场景是有多个JMS broker,有一个客户连接到其中一个broker。
如果这个broker失效,那么客户会自动重新连接到其它的broker。
在ActiveMQ 中使用failover:// 协议来实现这个功能。
ActiveMQ3.x版本的reliable://协议已经变更为failover://。
如果某个网络上有多个brokers而且客户使用静态发现(使用Static Transport 或Failover Transport)或动态发现(使用Discovery Transport),那么客户可以容易地在某个broker失效的情况下切换到其它的brokers。
ActiveMQ高可靠性解决方案
ActiveMQ高可靠性解决方案这周看了下activem q 的高可用解决方案,它是通过Master/Slave(主从备份)和failover 协议来支持的。
Master/Slave 有三种解决方案:Share Nothing Master/SlaveMaster 收到消息后保证先转发给slave后再发给客户端,slave有自己独立存储, 在slave 配置文件中需指定Master URI,这样当Master 宕掉后,客户端会Failover到Slave.2. Share File System Master/Slave没有物理上的Master, Slave之分,只有逻辑上的Master 和Slave, Master与Slave 共享一个存储文件,谁最先启动就会持有共享文件锁,成为Master, 后启动的由于获取文件锁时会被阻塞,成为Slave,当Master宕掉时,共享文件锁被释放掉,Slave获取的文件锁后就成为Master, 客户端使用failover 协议后会failover到可用的broker上。
3. Share Database Master/Slave和Share File System Master/Slave 类似,只不过用数据库锁代替了共享文件系统锁。
测试结果方案3由于会带来额外的复杂度,因此直接弃用。
测试了方案1和方案2,方案2的有点是不需要修改配置文件,易管理, 缺点是需要搭建个分布式共享文件系统,对于我们在线升级稍显麻烦。
方案2在我测试时也发现了些问题,当Master宕掉后,Slave不能立即升级为Master, 导致客户端failover失败。
(这个我有点怀疑是我nfs 没搞好,这个我有时间再研究下)方案1的缺点是需要额外的配置Slave配置文件及对应的存储空间,只能有一个slave因此只能failover一次, 由于存在主从复制,会带来稍许的性能开销。
但对于我们在线升级来说就比较简单,把Master数据存储文件拷贝到Slave下然后启动slave就行。
ActiveMQ集群搭建
8
//3.开启连接
9
connection.start();
10
//4.创建一个session对象 提供发送消息等方法
11
// 第一个参数:表示是否开启分布式事务(JTA) 一般是false 不开启。
12
// 第二个参数:就是设置消息的应答模式
13
// 如果 第一个参数为false时,第二个参数设置才有意义。用的是自动应答
37
@Override
38
public void onMessage(Message message) {
39
if(message instanceof TextMessage){
40
TextMessage message2 = (TextMessage) message;
41
try {
42
System.out.println("接收的消息为"+message2.getText());
29
}
30
}*/
31
//第二种
32
// 设置一个监听器
33
// System.out.println("start");
34
// 这里其实开辟了一个新的线程
35
consumer.setMessageListener(new MessageListener() {
36
//当有消息的时候会执行以下的逻辑
21
// 8.发送消息
22
producer.send(textMessage);
23
//9.关闭资源
24
producer.close();
Linux环境ActiveMQ部署方法详解
Linux环境ActiveMQ部署⽅法详解本⽂实例讲述了Linux环境ActiveMQ部署⽅法。
分享给⼤家供⼤家参考,具体如下:ActiveMQ环境部署下载apache-activemq-5.14.3-bin.tar.gz。
⼀、ActiveMQ需要JDK的⽀持附录说明linux安装jdk⼆、安装ActiveMQ1、解压apache-activemq-5.14.3-bin.tar.gztar -zxvf apache-activemq-5.14.3-bin.tar.gz2、进⼊cd apache-activemq-5.14.3/bin3、启动activemq./activemq start到这⾥,我们的ActiveMQ就运⾏起来了。
(注意:我们⽤的是root帐号,并且关闭了系统防⽕墙)三、使⽤ActiveMQ⾃带了⼀个web服务器(jetty,是java开发的),如果不了解没有关系,我们先学会怎么使⽤即可。
apache-activemq-5.14.3/conf/jetty.xml是该服务器的基本配置。
附:linux安装jdk1、下载下载jdk-8u121-linux-x64.tar.gz。
或者下载jdk-8u121-linux-x64.rpm。
(注意,选择对应的系统版本。
我们⽤的是centos,所以选择linux x64)2、给权限chmod +x jdk-8u121-linux-x64.rpm3、安装程序rpm -ivh jdk-8u121-linux-x64.rpm4、安装完成查看cd /usr#发现下⾯多了⼀个'java'⽬录cd /java#default jdk1.8.0_121 latest5、配置环境变量vi /etc/profile#在最后⾯加⼊#set java environmentexport JAVA_HOME=/usr/java/jdk1.8.0_121export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:/usr/local/php/bin:$JAVA_HOME/bin在终端使⽤echo命令检查环境变量设置情况。
消息队列——ActiveMQ使用及原理浅析
消息队列——ActiveMQ使⽤及原理浅析⽂章⽬录引⾔什么是消息中间件?随着业务的急速增长以及分布式架构的逐渐兴起,⾸先要考虑的就是如何⾼效的在各节点之间传递消息,其次要考虑的是流量洪峰时如何削减系统的压⼒以及跨平台消息的传输等问题,消息中间件就可以帮我们解决以上问题。
⽽消息队列产品众多,我们该如何选择呢?本系列⽂章主要针对⽬前使⽤最多的ActiveMQ、Kafka、RabbitMQ进⾏讲解说明。
正⽂⼀、ActiveMQ是如何产⽣的?产⽣背景⼀开始消息中间件的⼚商繁多,且各个⼚商之间没有统⼀的规范,这就导致了各消息中间件⾮常难以整合协作,因此,后来陆续出现了如JMS和AMQP 这样的消息队列规范,提供了统⼀的标准,⽽ActiveMQ就是完全遵循JMS规范开发的消息队列。
JMS规范基本概念什么是JMS(Java Message Service)规范?JMS是⼀个基于Java平台⾯向消息中间件(MOM)的API,⽤于在两个应⽤程序之间,或分布式系统中发送消息,进⾏异步通信。
在设计JMS时,设计师就计划能够结合现有消息队列的优点,如:不同的消息传送模式或域,例如点对点消息传送和发布/订阅消息传送⽀持同步和异步消息⽀持可靠性消息的传输⽀持常见的消息格式,如:⽂本、字节、流、对象等JMS体系结构上⾯是从百度找的⼀个图⽚,下⾯对其中各个对象分别进⾏说明:ConnectionFactory:连接⼯⼚,⼀般设为单例模式,⼀旦创建,就⼀直运⾏在应⽤容器内,客户端使⽤连接⼯⼚创建⼀个JMS连接。
Connection:JMS连接表⽰JMS客户端和服务器端之间的⼀个活动的连接。
Session:JMS会话表⽰JMS客户与JMS服务器之间的会话状态。
JMS会话建⽴在JMS连接上,表⽰客户与服务器之间的⼀个会话线程。
Destination:消息管道,从⽣产端流向客户端,包括队列(PTP),主题(Pub/Sub)。
Message Producer和Message Consumer:⽣产者和消费者对象由Session对象创建,⽤于发送和接收消息。
activemq高可用部署
一、将activemq压缩文件解压到目标文件夹。
二、实现单机部署2个mq应用1.将bin下的activemq启动文件复制一份并修改文件名称为activemq2。
2.将conf文件复制一份,并命名为conf2。
3.修改conf2下的activemq.xml配置文件a).修改brokerName的值,同一集群内不同节点避免重名。
b).修改<transportConnector>标签中的5个端口号,避免端口冲突。
4.修改conf2下的jetty.xml配置文件:a).修改mq服务的端口号,避免端口冲突。
5. 修改bin下activemq2a) .ACTIVEMQ_PIDFILE="$ACTIVEMQ_DATA/activemq-`hostname`.pid"修改为ACTIVEMQ_PIDFILE="$ACTIVEMQ_DATA/activemq2-`hostname`.pid"b) .ACTIVEMQ_CONF="$ACTIVEMQ_BASE/conf"修改为ACTIVEMQ_CONF="$ACTIVEMQ_BASE/conf2"c).ACTIVEMQ_QUEUEMANAGERUAL="--amqurl tcp://localhost:原端口" 修改为ACTIVEMQ_QUEUEMANAGERUAL="--amqurl tcp://localhost:新端口"三、修改activemq的配置因为国网ISC认证使用的也是activemq,且端口为默认端口。
虽然和项目没有部署在同一台服务器上,仍然建议对conf下的activemq.xml、jetty.xml和bin下的activemq文件配置文件进行第二项中的【3.b)】【4.a)】【5.c)】的端口修改操作。
到此,单台服务器上的双结点布置完成。
ActiveMQ集群搭建
ActiveMQ集群搭建 集群⽅案主要为了解决系统架构中的两个关键问题:⾼可⽤和⾼性能。
ActiveMQ服务的⾼可⽤性是指,在ActiveMQ服务性能不变、数据不丢失的前提下,确保当系统灾难出现时ActiveMQ能够持续提供消息服务,⾼可靠性⽅案最终⽬的是减少整个ActiveMQ停⽌服务的时间。
ActiveMQ服务的⾼性能是指,在保证ActiveMQ服务持续稳定性、数据不丢失的前提下,确保ActiveMQ集群能够在单位时间内吞吐更⾼数量的消息、确保ActiveMQ集群处理单条消息的时间更短、确保ActiveMQ集群能够容纳更多的客户端稳定连接。
下⾯我们分别介绍如何通过多个ActiveMQ服务节点集群⽅式,分别提供热备⽅案和⾼性能⽅案。
最后我们讨论如何将两种⽅案结合在⼀起,最终形成在⽣成环境下使⽤的推荐⽅案。
⼀、⾼可⽤集群以下内容来⾃:::1.1、ActiveMQ+ZooKeeper 伪集群整合伪集群⽅式,即在⼀台主机上部署3个activemq服务(端⼝不同)+3个zookeeper服务(端⼝不同)原理简介:⼀般在部署ActiveMQ集群的时候,更倾向于使⽤基于ZooKeeper的Replicated LevelDB Store⽅式,该⽅式是Master Slave部署⽅案的其中⼀种策略,也是在多台主机实现ActiveMQ集群的主流部署⽅式。
这⾥只保证了⾼可⽤性。
要想保证负载均衡得再结合Broker Clusters 部署⽅案,配置⽹络连接器。
⼯作流程:在ZooKeeper中管理多个Broker节点,根据 Master选举策略让其中⼀个 Broker选举为Master(只有Master才具备对外提供服务的能⼒),剩下Broker为slave。
编码时,client端(消费者)通过failover协议来连接ActiveMQ集群。
1.1.1、ZooKeeper伪集群配置规划--服务端⼝集群通信端⼝节点⽬录/usr/local下zk121812881:3881/zookeeper/zk1zk221822882:3882/zookeeper/zk2/zookeeper/zk3zk321832883:3883集群通信端⼝:第⼀个端⼝是master和slave之间的通信端⼝,默认是2881;第⼆个端⼝是leader选举的端⼝,集群刚启动的时候选举或者leader挂掉之后进⾏新的选举的端⼝默认是3881。
ActiveMQ集群部署与应用
本文主要讲解ActiveMQ的集群部署及主从切换演示,单机版部署及入门请移步 ,本篇内容需要使用zookeeper集群做支撑,未搭建zookeeper集群的朋友请看我的另一篇文章简介在高并发、对稳定性要求极高的系统中,高可用的是必不可少的,当然ActiveMQ也有自己的集群方案。
从ActiveMQ 5.9开始,ActiveMQ的集群实现方式取消了传统的Master-Slave方式,增加了基于ZooKeeper + LevelDB 的 Master-Slave 实现方式ActiveMQ3种集群方式对比(一)基于共享文件系统(KahaDB,默认)<persistenceAdapter><kahaDB directory="${activemq.data}/kahadb"/></persistenceAdapter>activemq.xml默认(二)基于JDBC持久化<persistenceAdapter><jdbcPersistenceAdapter dataSource="#MySQL-DS"/></persistenceAdapter><!--mysql-connector-javajaravtivemqlib--><bean id="MySQL-DS" class="mons.dbcp2.BasicDataSource" destroy-method="close"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/platform_mq?useUnicode=true&characterEn <property name="username" value="root"/><property name="password" value="xxxx"/></bean>(三)基于可复制的LevelDB(google开发类库,非服务)<persistenceAdapter><replicatedLevelDB directory="${activemq.data}/leveldb" #replicas="3" #bind="tcp://0.0.0.0:62621" #zkAddress="localhost:2181,localhost:2182,localhost:2183"hostname="localhost"zkPath="/activemq/leveldb-stores"/>#zookeeper</persistenceAdapter>本文主要讲解基于ZooKeeper和LevelDB搭建ActiveMQ集群,集群仅提供集群功能,避免单点故障,没有负载均衡功能,负载均衡后续更新高可用原理使用ZooKeeper(集群)注册所有的ActiveMQ Broker。
activeMQ集群的使用与配置
Clustering(集群)ActiveMQ从多种不同的方面提供了集群的支持。
1、Queue consumer clustersActiveMQ支持订阅同一个queue的consumers上的集群。
如果一个consumer 失效,那么所有未被确认(unacknowledged)的消息都会被发送到这个queue上其它的consumers。
如果某个consumer的处理速度比其它consumers更快,那么这个consumer就会消费更多的消息。
需要注意的是,笔者发现AcitveMQ5.0版本的Queue consumer clusters存在一个bug:采用AMQ Message Store,运行一个producer,两个consumer,并采用如下的配置文件:那么经过一段时间后可能会报出如下错误:ERROR[ActiveMQTransport:tcp:///127.0.0.1:1843-RecoveryListenerAdapter.java:58-RecoveryListenerAdapter] Message id ID:versus-1837-1203915536609-0:2:1:1:419 could not be recovered from the data store!Apache官方文档说,此bug已经被修正,预定在5.1.0版本上体现。
2、Broker clusters一个常见的场景是有多个JMS broker,有一个客户连接到其中一个broker。
如果这个broker失效,那么客户会自动重新连接到其它的broker。
在ActiveMQ 中使用failover:// 协议来实现这个功能。
ActiveMQ3.x版本的reliable://协议已经变更为failover://。
如果某个网络上有多个brokers而且客户使用静态发现(使用Static Transport或Failover Transport)或动态发现(使用Discovery Transport),那么客户可以容易地在某个broker失效的情况下切换到其它的brokers。
activemq配置详解
activemq配置详解<beansxmlns="/schema/beans"xmlns:amq="/schema/core"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans /schema/beans/s pring-beans-2.0.xsd/schema/core /schema/core/activemq-core.xsd"><!-- Allows us to use system properties as variables in this configur ation file --><bean class="org.springframework.beans.factory.conf ig.PropertyPlaceholderConfigurer"><property name="locations"><value>file:${activemq.base}/conf/credentials.pr operties</value></property></bean><!-- The <broker> element is used to configure the ActiveMQ brok er. --><!-- brokerName:必须定义一个名称 --><!-- 不使用持久化存储:persistent="false",注意:内存要足够大 --><broker xmlns="/schema/core" brokerName="testBro ker" dataDirectory="${activemq.base}/data" destroyApplicationContextOnStop="true" persistent="true"><destinationPolicy><policyMap><policyEntries><!-- 如果设定了<systemUsage>,则全局按照<systemUsage>,这里精细控制每一个q --><!-- 设定了flowcontrol以后,会根据memorylimit 的缓冲区设定的大小,决定producer的流速,即:可能拖慢producer --><!-- 设定flowcontrol false后(同时不设定systemUsage),虽然不会拖慢producer,但是可能会占用大量activemq的内存,如果处理仍然不及时,可能最终导致amq outofmemory --><!-- 参考下面<systemUsage>的说明 --><!-- 设定了false以后,表示producer直接都给,直到撑死systemUsage,才报客户端Exception --><policyEntry topic=">" producerFlowControl= "false" topicPrefetch="1000" useCache="true"><pendingSubscriberPolicy><vmCursor /></pendingSubscriberPolicy></policyEntry><!-- 设定true,表示超过memoryLimit以后,就等,等到systemUsage设定的超时时间报Exception --><!-- 尽管可以让systemUsage统一管理全部的,但也就失去了精细管理每一个队列的能力,如果队列有重要和不重要之分,即:有的允许丢数据的,就设定true和memoryLimit;有的不允许的,就单独设定 --><!-- 关于amq的特殊检测参数也在这里设定,参见/advisory-message.html --><!-- queuePrefetch:一次分配给consumer多少数量的消息 --><policyEntry queue=">" producerFlowControl ="true" memoryLimit="4mb" queuePrefetch="1000" useCache= "true"><!-- Use VM cursor for better latencyFor more information, see:/message-cursors.html<pendingQueuePolicy><vmQueueCursor/></pendingQueuePolicy>--></policyEntry></policyEntries></policyMap></destinationPolicy><!-- 设定jmx管理端口 --><managementContext><managementContext connectorPort="62222" j mxDomainName="testDomain" createConnector="true"/> </managementContext><!-- 设定持久化方案 --><persistenceAdapter><!-- 稳定性最强的一个 --><!-- <amqPersistenceAdapter useNIO="true" directory="target/Br oker2-data/activemq-data" syncOnWrite="true" indexPageSize="16kb" persistentInde x="true" indexMaxBinSize="100" maxFileLength="10mb" maxC heckpointMessageAddSize="32kb" cleanupInterval="3000" che ckpointInterval="20000" /> --><!-- 对于恢复来说,这个存储不能保证完全不丢数据。
activemq配置说明
Activemq配置说明1 概述以及activemq集群方案选择 (2)1.1 consumers的集群 (2)1.2 brokers的集群 (2)1.3 集群方案的选择 (2)2 服务端配置activemq配置 (2)2.1 服务端配置activemq.xml (2)2.2 客户端配置backend-mq-consumer.xml (3)3 测试 (4)3.1 采用单机方式,同步方式 (4)3.2 采用单机方式,异步方式 (4)4 待解决的问题 (5)1概述以及activemq集群方案选择1.1consumers的集群ActiveMQ支持订阅同一个queue的consumers上的集群。
如果一个consumer失效,那么所有未被确认(unacknowledged)的消息都会被发送到这个queue上其它的consumers。
如果某个consumer的处理速度比其它consumers更快,那么这个consumer就会消费更多的消息。
1.2brokers的集群在一个网络内运行多个brokers或者stand alone brokers时存在一个问题,这就是消息在物理上只被一个broker持有,因此当某个broker失效,那么你只能等待直到它重启后,这个broker上的消息才能够被继续发送(如果没有设置持久化,那么在这种情况下,消息将会丢失)。
1.3集群方案的选择经筛选我们采用主--从方式,Master Slave 背后的想法是,消息被复制到slave broker,因此即使master broker遇到了像硬件故障之类的错误,你也可以立即切换到slave broker而不丢失任何消息。
Master Slave是目前ActiveMQ推荐的高可靠性和容错的解决方案。
并且我们采用文件系统做持久化,即:Shared File System Master Slave。
可以运行多个broker,这些broker共享数据目录。
ActiveMQ集群安装和部署
ActiveMQ集群安装和部署目录1. 准备工作 (2)2. 安装JDK (2)3. 安装ActiveMQ (5)1) 解压ActiveMQ (5)2) 验证 (6)4. ActiveMQ集群配置 (6)1) Master配置 (6)2) Slave配置 (7)11.准备工作两台安装好windows环境的服务器,本文环境是windows2003 Server R2 (SP2) JDK安装包,本文使用的是jdk-7u17-windows-i586.exeActivemq安装包,本文使用的是activemq-5.6.rar2.安装JDK运行exe,点击下一步再下一步就可以了,安装完后设置系统变量,如下图:设置java_home,指向JDK的安装文件夹2在”System variables”中添加classpath,指向jdk的lib文件夹3在”System variables”中添加path,指向jdk的bin文件夹4测试jdk安装是否成功,运行cmd,输入java –version,显示java版本说明jdk安装成功,如下图:3.安装ActiveMQ1)解压ActiveMQ在c盘下创建activemq文件夹,解压ActiveMQ压缩包到这个文件夹。
找到C:\ActiveMQ\bin下的activemq.bat文件,双击打开,显示如下:5接下来测试MQ是否正常运行:2)验证打开浏览器,在地址栏输入:http://localhost:8161/admin,如果能显示如下界面,说明安装成功ActiveMQ需要做集群服务,要在两台服务器上分别安装,选择一台做Master,另外一台做Slave。
Master和Slave的安装方法是一样的,重复以上步骤即可。
4.ActiveMQ集群配置1)Master配置选定一台服务器作为Master,找到Activemq的配置文件夹C:\ActiveMQ\conf,用记事本打开文件activemq.xml,把broker节点的brokername改为”pure_master”,如下图:6打开统计功能插件。
activemq分布式部署
分布式部署ActiveMQ服务器针对海量消息所要求的横向扩展性和系统的高可用性,ActiveMQ提供了网络连接模式的集群功能。
简单的说,就是通过把多个不同的broker实例连接在一起,作为一个整体对外提供服务,从而提高整体对外的消息服务能力。
通过这种方式连接在一起的broker 实例之间,可以共享队列和消费者列表,从而达到分布式队列的目的。
ActiveMq支持的网络协议名词解释●transportconnector传输连接器,实现客户端与代理(client-to-broker)之间的通信●network connector网络连接器,实现代理与代理之间的通信拓扑结构几种不同的ActiveMQ部署拓扑结构(嵌入、主从复制、集群):配置示例嵌入式在activemq.xml的broker节点内添加:<networkConnectors><networkConnector uri="static:(tcp://localhost:62001)"/></networkConnectors>●主从复制<networkConnectors><networkConnector uri="multicast://default"/></networkConnectors><transportConnectors><transportConnectoruri="tcp://localhost:0" discoveryUri="multicast://default"/></transportConnectors>第一个是master,其他是slave●集群使用静态URI方式可以指定多个URL,networkConnector将连接到每一个broker。
ActiveMQ之Broker HUB集群方案
ActiveMQ之Broker HUB集群模式方案文档编号:2020-12-09当前版本:V1.0.0编写者:海带发布时间:2020-12-09修订记录1.概述 (4)1.1非HUB模式 (4)1.2HUB模式 (5)2.规划 (6)2.1采用Mysql存储 (7)2.2Broker (7)2.3HUB (7)2.4生产者/消费者 (8)1.概述本文档为海带中间件系列之ActiveMQ Broker HUB集群篇,主要描述了ActiveMQ 的Broker集群HUB模式的搭建方式,用以解决大规模的应用消息处理问题。
1.1非HUB模式这个架构3个broker之间两两互通,整体可用性极高,但是从消息的路由角度来看却不是一个好的设计,当producer向broker1发送一条消息时,consumer得到消息的路径可能有如下2条:a)producer -> broker1 -> broker2b)producer -> broker1 -> broker3 -> broker2当broker更多时,情况会更复杂,如下面这张图:消息的路由途径将会更多:a) producer -> broker1 -> broker4b) producer -> broker1 -> broker2 -> broker4c) producer -> broker1 -> broker2 -> broker3 -> broker4d) producer -> broker1 -> broker3 -> broker4不难想象,每多经过一个节点,消息处理的延时将会增加一些,broker越多,情况越复杂,最终系统对外表现为消息处理有时很快,有时很慢,整体性能很不稳定,所以实际生产环境中并不采用所有broker之间两两互连的方案。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ActiveMQ集群部署方式对比构建高可用的ActiveMQ系统在生产环境中是非常重要的,单点的ActiveMQ作为企业应用无法满足高可用和集群的需求,所以ActiveMQ提供了master-slave、broker cluster等多种部署方式,但通过分析多种部署方式之后我认为需要将两种部署方式相结合才能满足我们公司分布式和高可用的需求。
自从activemq5.9.0开始,activemq的集群实现方式取消了传统的Pure Master Slave方式,增加了基于zookeeper+leveldb的实现方式,其他两种方式:目录共享和数据库共享依然存在。
1、Master-Slave部署方式1)、Shared Filesystem Master-Slave方式2)、Shared Database Master-Slave方式3)、Replicated LevelDB Store方式第一种方案同样支持N个AMQ实例组网,但由于他是基于kahadb存储策略,亦可以部署在分布式文件系统上,应用灵活、高效且安全。
(如果不需要考虑负载问题,则可用考虑用分布式文件系统模式部署)第二种方案与shared filesystem方式类似,只是共享的存储介质由文件系统改成了数据库而已,支持N个AMQ实例组网,但他的性能会受限于数据库;第三种方案是ActiveMQ5.9以后才新增的特性,使用ZooKeeper协调选择一个node作为master。
被选择的master broker node开启并接受客户端连接。
其他node转入slave模式,连接master并同步他们的存储状态。
slave不接受客户端连接。
所有的存储操作都将被复制到连接至Master的slaves。
如果master死了,得到了最新更新的slave被允许成为master。
fialed node能够重新加入到网络中并连接master进入slave mode。
所有需要同步的disk的消息操作都将等待存储状态被复制到其他法定节点的操作完成才能完成。
所以,如果你配置了replicas=3,那么法定大小是(3/2)+1=2. Master将会存储并更新然后等待(2-1)=1个slave存储和更新完成,才汇报success。
至于为什么是2-1,熟悉Zookeeper的应该知道,有一个node要作为观擦者存在。
单一个新的master被选中,你需要至少保障一个法定node在线以能够找到拥有最新状态的node。
这个node将会成为新的master。
因此,推荐运行至少3个replica nodes,以防止一个node失败了,服务中断。
Shared Filesystem Master-Slave方式shared filesystem Master-Slave部署方式主要是通过共享存储目录来实现master和slave的热备,所有的ActiveMQ应用都在不断地获取共享目录的控制权,哪个应用抢到了控制权,它就成为master。
多个共享存储目录的应用,谁先启动,谁就可以最早取得共享目录的控制权成为master,其他的应用就只能作为slave。
Apache ActiveMQ单点基本配置的原配置内容:<persistenceAdapter><kahaDB directory="${activemq.data}/kahadb"/></persistenceAdapter>SharedFile System Master Slave 修改为:<persistenceAdapter><kahaDB directory="D:\\ActiveMQ Cluster\\shareBrokerData" enableIndexWriteAsync="true" enableJournalDiskSyncs="false"/></persistenceAdapter>在D:\\ActiveMQ Cluster目录先创建shareBrokerData文件夹。
注意:1.前面提到如果在一台设备上部署多个AMQ,需要修改对应端口号,如AMQ对外的监听端口61616和jetty的监听端口8161等。
2.如果多套AMQ部署在不同的设备上,这里的directory应该指向一个远程的系统目录(分布式文件系统)3.客户端通过failover方式进行连接,多个AMQ实例地址使用英文逗号隔开,当某个实例断开时会自动重连,但如果所有实例都失效,failover默认情况下会无限期的等待下去,不会有任何提示。
下面为在一台设备上部署两个AMQ示例:ActiveMQ A1.activemq.xml修改监听端口:<transportConnectors><!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --><!-- add &wireFormat.maxInactivityDuration=0 --><transportConnector name="openwire"uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireformat.maxFrameSize=1048576 00&wireFormat.maxInactivityDuration=0" discoveryUri="multicast://default"/> <transportConnector name="amqp"uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireformat.maxFrameSize=104857 600&wireFormat.maxInactivityDuration=0"/></transportConnectors>2.jetty.xml修改监听端口:<property name="connectors"><list><bean id="Connector" class="org.eclipse.jetty.server.nio.SelectChannelConnector"></bean><!--Enable this connector if you wish to use https with web console--><!--<bean id="SecureConnector"class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector"><property name="port" value="8162" /><property name="keystore" value="file:${activemq.conf}/broker.ks" /><property name="password" value="password" /></bean>--></list></property>ActiveMQ B1.activemq.xml修改监听端口:<transportConnectors><!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --> <!-- add &wireFormat.maxInactivityDuration=0 --><transportConnector name="openwire"uri="tcp://0.0.0.0:61617?maximumConnections=1000&wireformat.maxFrameSize=1048576 00&wireFormat.maxInactivityDuration=0" discoveryUri="multicast://default"/> <transportConnector name="amqp"uri="amqp://0.0.0.0:5673?maximumConnections=1000&wireformat.maxFrameSize=104857 600&wireFormat.maxInactivityDuration=0"/></transportConnectors>2.jetty.xml修改监听端口:<property name="connectors"><list><bean id="Connector" class="org.eclipse.jetty.server.nio.SelectChannelConnector"><property name="port" value="8167" /></bean><!--Enable this connector if you wish to use https with web console--><!--<bean id="SecureConnector"class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector"><property name="keystore" value="file:${activemq.conf}/broker.ks" /><property name="password" value="password" /></bean>--></list></property>Java测试程序代码:1.Producer:import javax.jms.Connection;import javax.jms.DeliveryMode;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageProducer;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory;public class ProducerTool {private String subject = "TOOL.DEFAULT";private Destination destination = null;private Connection connection = null;private Session session = null;private MessageProducer producer = null;// 初始化private void initialize() throws JMSException, Exception {ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("failover:(tcp://172.16.30.11:61616?wireFormat.maxInactivityDurat ion=0,tcp://172.16.30.11:61617?wireFormat.maxInactivityDuration=0)");connection = connectionFactory.createConnection();session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);destination = session.createQueue(subject);producer = session.createProducer(destination);producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);}// 发送消息public void produceMessage(String message) throws JMSException, Exception { initialize();TextMessage msg = session.createTextMessage(message);connection.start();System.out.println("Producer:->Sending message: " + message);producer.send(msg);System.out.println("Producer:->Message sent complete!");}// 关闭连接public void close() throws JMSException {System.out.println("Producer:->Closing connection");if (producer != null)producer.close();if (session != null)session.close();if (connection != null)connection.close();}}import javax.jms.Connection;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageConsumer;import javax.jms.MessageListener;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory;public class ConsumerTool implements MessageListener {private String subject = "TOOL.DEFAULT";private Destination destination = null;private Connection connection = null;private Session session = null;private MessageConsumer consumer = null;// 初始化private void initialize() throws JMSException, Exception {ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("failover:(tcp://172.16.30.11:61616,tcp://172.16.30.11:61617)");connection = connectionFactory.createConnection();session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);destination = session.createQueue(subject);consumer = session.createConsumer(destination);}// 消费消息public void consumeMessage() throws JMSException, Exception {initialize();connection.start();System.out.println("Consumer:->Begin listening...");//consumer.setMessageListener(this);// Message message = consumer.receive();}// 关闭连接public void close() throws JMSException {System.out.println("Consumer:->Closing connection");if (consumer != null)consumer.close();if (session != null)session.close();if (connection != null)connection.close();}// 消息处理函数public void onMessage(Message message) {try {if (message instanceof TextMessage) {TextMessage txtMsg = (TextMessage) message;String msg = txtMsg.getText();System.out.println("Consumer:->Received: " + msg);} else {System.out.println("Consumer:->Received: " + message);}} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}2.Consumer:import javax.jms.Connection;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageConsumer;import javax.jms.MessageListener;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory;public class ConsumerTool implements MessageListener {private String subject = "TOOL.DEFAULT";private Destination destination = null;private Connection connection = null;private Session session = null;private MessageConsumer consumer = null;// 初始化private void initialize() throws JMSException, Exception {ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("failover:(tcp://172.16.30.11:61616,tcp://172.16.30.11:61617)");connection = connectionFactory.createConnection();session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);destination = session.createQueue(subject);consumer = session.createConsumer(destination);}// 消费消息public void consumeMessage() throws JMSException, Exception { initialize();connection.start();System.out.println("Consumer:->Begin listening...");//consumer.setMessageListener(this);// Message message = consumer.receive();}// 关闭连接public void close() throws JMSException {System.out.println("Consumer:->Closing connection");if (consumer != null)consumer.close();if (session != null)session.close();if (connection != null)connection.close();}// 消息处理函数public void onMessage(Message message) {try {if (message instanceof TextMessage) {TextMessage txtMsg = (TextMessage) message;String msg = txtMsg.getText();System.out.println("Consumer:->Received: " + msg);} else {System.out.println("Consumer:->Received: " + message);}} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}3.Mainimport javax.jms.JMSException;public class Test {/*** @param args*/public static void main(String[] args) throws JMSException, Exception {ConsumerTool consumer = new ConsumerTool();ProducerTool producer = new ProducerTool();// 开始监听consumer.consumeMessage();// 延时500毫秒之后发送消息Thread.sleep(500);producer.produceMessage("Hello, world!");producer.close();// 延时500毫秒之后停止接受消息Thread.sleep(500);consumer.close();}}ActiveMQ A 启动界面:ActiveMQ B 启动界面:AMQ A先启动,先锁文件,当AMQ B启动是,不能锁文件,但会不断的监听等待。