ActiveMQ是一种开源的,实现了JMS1.1规范的,面向(MOM)的中间件,为运用程序供应高效的、可扩展的、稳定的和安全的企业级通信。ActiveMQ利用Apache供应的授权,任何人都可以对实在当代码进行修正。
ActiveMQ的设计目标是供应标准的,面向的,能够超过多措辞和多系统的运用集成通信中间件。ActiveMQ实现了JMS标准并供应了很多附加的特性。这些附加的特性包括,JMX管理(java Management Extensions,即java管理扩展),主从管理(master/salve,这是集群模式的一种,紧张表示在可靠性方面,当主中介(代理)涌现故障,那么从代理会替代主代理的位置,不至于使系统瘫痪)、组通信(同一组的,仅会提交给一个客户进行处理)、有序管理(确保能够按照发送的次序被接管者吸收)。优先级(优先级高的先被投递和处理)、订阅的延迟吸收(订阅在发布时,如果订阅者没有开启连接,那么当订阅者开启连接时,中介将会向其提交之前的,其未处理的)、吸收者处理过慢(可以利用动态负载平衡,将多数提交到处理快的吸收者,这紧张是对PTP所说)、虚拟吸收者(降落与中介的连接数目)、成熟的持久化技能(部分须要持久化到数据库或文件系统中,当中介崩溃时,信息不会丢失)、支持游标操作(可以处理大)、支持的转换、通过利用Apache的Camel可以支持EIP、利用镜像行列步队的形式轻松的对行列步队进行监控等。
2. ActiveMQ 特性

支持JMS规范:ActiveMQ完备实现了JMS1.1规范。
JMS规范供应了同步和异步投递办法、有且仅有一次投递语义(指的吸收者对一条必须吸收到一次,并且仅有一次)、订阅持久吸收等。如果仅利用JMS规范,表明无论您利用的是哪家厂商的代理,都不会影响到您的程序。
连接办法的多样化:ActiveMQ供应了广泛的连接模式,包括HTTP/S、JGroups、JXTA、muticast、SSL、TCP、UDP、XMPP等。供应了如此多的连接模式表明了ActiveMQ具有较高的灵巧性。
可插入式的持久化和安全:ActiveMQ供应了多种持久化方案,您可以根据实际须要进行选择。同时,也供应了完全的客户授权模式。
利用Java创建运用程序:最常见的利用ActiveMQ的办法便是利用Java程序来发送和吸收。
与其他的Java容器紧密集成:ActiveMQ供应了和其它盛行的Java容器的结合,包括Apache Geronimo、Apache Tomcat、JBoss、Jetty等。
客户端API:ActiveMQ供应了多种客户端可访问的API,包括Java、C/C++,.NET,Perl、PHP、Python、Ruby等。当然,ActiveMQ中介必须运行在Java虚拟机中,但是利用它的客户端可以利用其他的措辞来实现。
中介集群:多个ActiveMQ中介可以一起协同事情,来完成某项繁芜的事情,这被称为网络型中介(network of brokers),这种类型的中介将会支持多种拓扑类型。
3. 为什么利用ActiveMQ
在设计分布式运用程序时,运用程序间的耦合(或称集成)办法很主要。耦合意味着两个或者多个运用程序或系统的相互依赖关系。一种大略的办法是在所有的运用程序中从架构上设计他们与其他运用程序间的交叉实现。这样一定导致,一个运用程序的改变,直接导致另一个运用程序的改变。按照这种办法集成的运用是一种紧耦合的运用。一个运用的改变不会影响到其他运用的集成办法被称为是松耦合的集成办法。大略的说,松耦合运用程序集成能够更随意马虎的处理不可预见的运用变革。
像COM、CORBA、DCE和EJB等运用技能利用RPC(Remote Procedural Calls,即远程过程调用)属于紧耦合技能。利用RPC,一个运用程序调用另一个运用程序,调用者必须壅塞,直到被调用者实行结束返回结果信息为止。下图给出了这种紧耦合技能的描述:
许多系统架构利用RPC,并且得到了巨大的成功,但是,紧耦合的架构有着天生的毛病。首先,这种架构将会造成系统掩护管理上的巨大消费,由于,纵然是很小的改动,很可能会波及到全体系统。其次,由于调用者必须壅塞式的等待被调用者返回,如果被调用者处理过程繁芜,将会严重影响调用者的实行效率和资源利用率。此外,如果调用失落败,全体架构即失落败。
下图给出一种松耦合的办法,进行架构设计:
运用程序1向中介(MOM)发送一条,很可能一段韶光之后,运用程序2调用MOM来收取消息。任何一个运用程序都不知道对方是否存在也不须要壅塞等待。这种通信办法大大缩减了掩护开销,由于对付一个运用程序的修正,会对其他运用程序影响极小。
ActiveMQ便是采取了上面提到的松耦合办法,因此,我们常常说运用程序发送仅仅是触发后忘怀。运用程序将发送给ActiveMQ而并不关心什么韶光以何种办法投递给吸收者。同样的,吸收者也不会关心来源于哪里和是若何投递给ActiveMQ的。对付多措辞编写的繁芜运用环境中,许可客户端利用不同的编程措辞乃至不同的包装协议。ActiveMQ作为的中间件,许可繁芜的多措辞运用程序以一种一步的办法集成和交互。以是说,ActiveMQ是一种好的,供应疏松耦合的,能够为多措辞交叉运用供应集成的中间件。
4. 什么情形下利用ActiveMQ
正如前面提到的,紧耦合运用系统存在许多问题,但是,要将紧耦合系统重构成松耦合系统是一件值得但比较繁琐的事情。利用松耦合的紧张上风表示在将同步改为异步。利用异步通信,运用程序将从吸收者反馈的等待中解放出来,其他的任务可以得到实行,这样提高了运用程序的效率。
只假如两个运用程序间须要通信的情形,都可以考虑利用JMS,不论这种通信是在本地的(便是通信的两个运用程序在同一台主机上),还是分布在不同机器上。只管是在同一个主机上的两个运用程序须要通信也可以利用ActiveMQ。ActiveMQ可以确保投递成功并采取异步办法通信。
多个须要通信的运用程序在同一个机器上的情形下,您可以考虑在实行机上独立运行ActiveMQ或者将ActiveMQ嵌入到Java运用做事中。无论采取哪种办法,都可以确保运用程序能够发送和吸收。您可以选择订阅模式(pub/sub)或者采取PTP(point to point)模式,这两种模式都无需等待实行反馈信息。每一个运用程序都可以大略的将发送给ActiveMQ,然后连续做其他的事情;运用程序无需壅塞式等待的返回。
对付分布在多台主机上的运用程序来说,可以利用多种支配策略。紧张包括单一ActiveMQ实例和多ActiveMQ实例。单一ActiveMQ实例是一个大略办理方案。所有的运用程序都向同一个ActiveMQ中介发送和吸收,这与上面提到的单机多做事雷同。单一的ActiveMQ可以支配到一台单独的主机上,也可以和个中的一些做事支配在一起。主要的是,所有的运用必须能够直接与ActiveMQ中介进行交互,以是,你必须考虑到你的网络设计。
第二种情形比较繁芜,但是有ActiveMQ来卖力远程通信,而不是运用程序自身。在这种场景下,每一个运用程序都会实例化一个ActiveMQ(无论是嵌入式的还是独立式的),运用程序从其本地的ActiveMQ发送和吸收。之后这些ActiveMQ实例将会以一种联合的办法协同事情。将会基于每一个运用的哀求在多个ActiveMQ中介间通报到远程的处理者。在ActiveMQ中,这种模式被称为netWork of brokers。采取这种模式对付处理大量的ActiveMQ是可行的,但是,我们每每须要减轻网络拓扑的繁芜性,这样直接将投递到远程吸收者的ActiveMQ是不可行的。在后一种情形下,不同的协议利用可以使ActiveMQ更轻松的通报。
5. ActiveMQ传输效率
打算机环境
CPU:Intel(R) Cpu G530 @ 2.40GHz 2.40 Memory:2GB HD:希捷 ST3500620AS OS:window xp Service Pack 3
发送10万条长度为25的耗时6~7秒钟, cpu占用量很大。
如果持续发送不接管的话,做事器承受到30万时随意马虎卡住发送达到26秒之多
一次性吸收所有的50万,cpu占用100%占用韶光50s旁边,可以全部吸收。
吸收完成后在连续发送10万占用韶光6~7s
在一次性发送50万时涌现问题
INFO | Usage Manager Memory Limit (524288000) reached on queue://FirstQueue. Producers will be throttled to the rate at which messages are removed from this destination to prevent flooding it. See
http://activemq.apache.org/producer-flow-control.html for more info
在网上找缘故原由说是配置了发送限定,修正xml 运行韶光是53s 的样子
连续发送50万,一分50秒
在发送50万
在发送50万2分多钟的样子
试着吸收这200万可以成功,但韶光很长。
修正xml后在接管的同时发送10万,
一次发送100万耗时4分旁边的样子
吸收方也可以全部吸收。
仿照做事器断电,非持久性模式时没有被消费的不会连续消费,全部丢失
程序会报一个连接关闭非常停滞运行,连续启动做事器运行程序,不会吸收任何。
仿照做事器断电,持久性模式时没有被消费的会连续消费
定义了的持久性模式后,纵然关闭了做事器,程序也会报连接关闭非常,但再次启动做事器和程序后,吸收方还能连续原来的再次吸收。
总结
总体看来,在配置好xml的情形下,activemq对传输上还是没有问题的,发送的都可以全部吸收,发送多少条就吸收多少条,准确度上还是有担保的,持久模式支持断电续传功能。虽然功能上没有什么问题但对cpu的占用率就比较大了,发送或接管的时候都达到了100%,内存到不会很大。这跟自己利用机子有关系,配置好点的机子可能情形会好些。