什么是消息中间件(MQ)?
1.1 为什么会需要消息队列(MQ)?
主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达MySQL,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。
2.2 什么是消息中间件
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也就有Producer(生产者)、Consumer(消费者)
常见的消息中间件产品:
(1)ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。我们在本次课程中介绍 ActiveMQ的使用。
(2)RabbitMQ
AMQP协议的领导实现,支持多种场景。淘宝的MySQL集群内部有使用它进行通讯,OpenStack开源云平台的通信组件,最先在金融行业得到运用。
(3)ZeroMQ
史上最快的消息队列系统
(4)Kafka
Apache下的一个子项目 。特点:高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统。适合处理海量数据。
ActiveMQ
ActiveMQ是Apache的一个开源项目,它是一个能力强劲的开源消息总线,也是一个中间件产品。它是JMS的一个实现。
首先了解一下JMS
JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。
JMS是Java Message Service的简称,用来发送异步消息,在不同系统和不同的模块之间我们可以利用它实现集成。
JMS有两个好处:第一个就是让模块之间或者系统之间的耦合度降低,第二个是异步通信。
JMS本身只定义了一系列的接口规范,是一种与厂商无关的 API,用来访问消息收发系统。它类似于 JDBC(java Database Connectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持 JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,这只是几个例子。 JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JML 客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。
JMS 定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。
· TextMessage--一个字符串对象
· MapMessage--一套名称-值对
· ObjectMessage--一个序列化的 Java 对象
· BytesMessage--一个字节的数据流
· StreamMessage -- Java 原始值的数据流
JMS的消息机制有2种模型,
一种是Point to Point,表现为队列的形式。发送的消息,只能被一个接收者取走;
另一种是Topic,可以被多个订阅者订阅,类似于群发。
在JMS中有这样几个重要的核心接口和类:
ConnectionFactory:用于jms client获取与jms provider的连接。不同的jms产品,对这个接口有不同的实现,比如说ActiveMQ,这个接口的实现类是ActiveMQConnectionFactory Connection:是由ConnectionFactory产生的,表示jms client与jms provider的连接 Session:是由Connection产生的,表示一个会话。Session是关键组件,Message、Producer/Consumer、Destination都是在Session上创建的 Message:这个组件很好理解,就是传输的消息,里面包括head、properties、body,其中head是必选的 Destination:是消息源,对发送者来说,就是消息发到哪里;对接收者来说,就是从哪里取消息。Destination有2个子接口,Queue和Topic,分别对应上面提到的2种模型 MessageProducer:是消息发送者 MessageConsumer:是消息接收者,和Message Producer是相反的一种组件
JMS有所了解之后,我们来看ActiveMQ
ActiveMQ特性
- 遵循JMS规范:ActiveMQ的各种特性是JMS1.1规范的实现。它们包括同步和异步消息传递,一次和只有一次的消息传递,对于预订者的持久消息等等。依附于JMS规范意味着,不论JMS消息提供者是谁,同样的基本特性都是有效的。
- 连接:ActiveMQ提供各种连接选择,包括HTTP,HTTPS,IP多点传送,SSL,STOMP,TCP,UDP,XMPP等。大量的连接协议支持使之具有更好的灵活性。
- 支持多种语言客户端:ActiveMQ对多种语言提供客户端API,除了Java之外还有C/C++、.NET、Perl、PHP、Ruby、Python等。这使得ActiveMQ能用在Java之外的其它语言中。很多其它语言都可以通过ActiveMQ提供的客户端API使用ActiveMQ的全部特性。当然,ActiveMQ代理器(broker)仍然是运行在java虚拟机上,但是客户端能够使用其它的被支持的语言。
- 可插拔的持久性和安全:ActiveMQ提供多种持久性方案可供选择,也可以完全按自己需求定制验证和授权。例如,ActiveMQ通过KahaDB提供自己的超快速消息持久方案(ultra-fast message persistence),但也支持标准的JDBC方案。ActiveMQ可以通过配置文件提供简单的验证和授权,也提供标准的JAAS登陆模块。
- 简单的管理:ActiveMQ是为开发者设计的。它并不需要专门的管理工具,因为它提供各种易用且强大的管理特性。有很多方法去监控ActiveMQ的各个方面,可以通过JMX使用JConsole或ActiveMQ web console;可以运行ActiveMQ消息报告;可以用命令行脚本;可以通过日志。
- 支持集群:为了利于扩展,多个ActiveMQ broker能够联合工作。这个方式就是network of brokers并且能支持多种拓扑结构。
ActiveMQ的安装
- 将AMQ的tar包上传至指定文件夹(如:/home/cspgs)
- 进入部署目录,解压文件(我这里的部署路径是/home/cspgs)
命令:tar -zxvf apache-activemq-5.12.1-bin.tar.gz
并将解压后的目录名改为activemq
命令:mv apache-activemq-5.12.1 activemq
为了能够使用JMX监控远程的ActiveMQ,我们需要对ActiveMQ进行配置,以使JMX能够正确连接到远程的ActiveMQ监控服务。
- 进入activemq目录,修改conf目录下的activemq.xml文件,修改2个地方
命令:vi conf/activemq.xml
(1)修改broker属性中的字段,添加 useJmx= "true"
修改后:
(2)在文件中将managementContext的内容修改为下面的内容
<managementContext> <managementContext createConnector="true" connectorPort="11099" /> </managementContext>
默认:
- 查看端口是否被占用
Activemq有这几个端口,分别是:
conf目录的activemq.xml的5个端口
以及conf目录下jetty.xml的1个端口
查看端口是否被占用命令,xxx为端口:
netstat -apn | grep xxx
端口被占用如下:
LISTEN那一行,表示被占用。
LISTENING并不表示端口被占用,不要和LISTEN混淆哦,查看具体端口时候,必须要看到tcp,端口号,LISTEN那一行,才表示端口被占用了
- 进入ActiveMQ启动目录下
命令:cd bin/linux-x86-64
- 启动ActiveMQ,并查看进程,amq启动后会有2个进程
命令:./activemq start
查看进程:ps -ef | grep activemq
- 检验ActiveMQ是否启动成功
在浏览器输入url地址:http://ip:8161/admin
比如:我的地址是:http://192.168.80.72:8161/admin
有的访问需要用户和密码:admin/admin
出现这个页面表示已经启动成功。
- 如果activemq没有启动成功,查看日志文件,分析原因具体解决,日志文件位于logs目录下的activemq.log文件
-
IPv6配置更改不需要更改任何配置信息。
-
IPv6应用连接
程序连接地址需要修改为IPv6地址
flow.queue.url=tcp://[fd15:4ba5:5a2b:1008:20c:29ff:fe45:98c7]:61616
-
验证IPv6过程
用IPv6地址访问ActiveMQ,访问成功。
浏览器访问地址:http://[fd15:4ba5:5a2b:1008:20c:29ff:fe45:98c7]:8161/admin/