最近闲暇的时候在看一本书,关于分布式系统的,作者从使用者的角度和开发者的角度讲述了分布式系统的大体架构、组成以及一些分布式系统使用到的技术等等。其中,作者在讲突发流量到来的时候的消峰策略时,提到了一种通过异步调用来实现消峰的方式——使用消息队列MQ(message queue)。此时作者简单说了说两种消息队列的开源实现,apache开源的activeMQ和阿里开源的RocketMQ。其中activeMQ是为企业级应用而服务,而RocketMQ更适合用于高并发和海量数据的场景。一时兴起,学习了学习activeMQ。
activeMQ 是Apache推出,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。它有以下特性:
⒈ 多种语言和协议编写客户端。语言: Java,C,C++,C#,Ruby,Perl,Python,PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
⒉ 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
⒊ 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
⒋ 通过了常见J2EE服务器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
⒌ 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
⒍ 支持通过JDBC和journal提供高速的消息持久化
⒎ 从设计上保证了高性能的集群,客户端-服务器,点对点
⒏ 支持Ajax
⒐ 支持与Axis的整合
⒑ 可以很容易的调用内嵌JMS provider,进行测试
首先是activeMQ的下载和安装。个人不太建议activeMQ通过apt-get方式安装,反正我是在一个云服务器中进行安装的,通过apt-get方式安装的话,对应的网络管理系统(默认8161端口访问)是没有的,估计是我安装得有问题吧。直接从apache的网站上可以下载到activeMQ的可执行文件:
http://activemq.apache.org/,我安装时最新版本是
5.15.1。下载apache-activemq-5.15.1-bin.tar.gz文件到云服务器上,tar命令解压,编辑bin文件夹下的env文件,添加JAVA_HOME的路径(activeMQ是用JAVA写的,当然需要java环境)。这里我用的是1.8的java可用,1.6版本的java我试过了,不能用,运行时会报错,1.7_051版本的java我也试过了,也会出错,显示版本不对,所以还是直接用1.8版本的java好。配置完成后直接通过root权限执行bin文件夹下的activemq(这是一个脚本文件),sudo ./activemq start 表示在后台执行,如果想关闭通过sudo ./activemq stop;sudo ./activemq console表示通过窗口执行,如果窗口被关闭,activemq的进程自然就没了。启动完成后,会显示几条日志,如下图所示。通过查看61616端口和8161端口是否被activemq相关进程占用即可判断是否启动成功(61616端口是activemq的服务提供端口,可通过配置文件进行配置。8161是activemq的网管端口,可以通过http协议访问,用户名密码默认都是admin)。
然后就是activemq的使用了,activemq支持使用多种语言编写它的客户端(消息生产者和消息消费者),如果使用java,则将activemq安装包中lib文件夹下的相关jar包导入到IntelliJ工程中就行了;如果使用C++需要在apache的网站上下载activemq-cpp-library-3.9.4-src.tar.gz。这里以java为例,初步学习,参考了网上的一些代码,写了写生产者和消费者最简单的代码。
生产者:
消费者:
运行后就可以看到生产者发送出去的消息,消费者全都接收到了并且进行了消费。
最后就是activemq的网管系统了。登录http://服务器IP:8161即可,初始界面如下所示:
重点看Queues一栏把,Queues一栏如下所示:
其中,Number Of Pending Messages表示进入到该队列的消息总数,Messages Enqueued表示现在还处在该队列中的消息的数量,Messages Dequeued表示从队列中出来的消息的数量。一旦activemq服务重启,所有数字均会清零,但是曾经创建的队列是不会清零的。
还可以通过xml格式来看当前队列的相关信息,如下图:
可以发现当前一共创建了两个消息队列,MyFirstQueue和MyFirstQueu。