ActiveMQ--介绍
1.特点
- 支持多语言的客户端和协议。
- 提供了像消息组通信、消息优先级、延迟接收消息、虚拟接受者、消息持久化之类的高级特性。
- 完全支持JMS1.1和J2EE1.4规范(包括持久化、分布式事务消息、事务)。
- 支持Spring框架。
- 通过了常见的J2EE服务器测试。
- 连接方式多样化。
- 支持通过使用JDBC和Journal实现消息的快速持久化。
- 为高性能集群、客户端-服务端、点对点通信等场景而设计。
- 提供了技术和语言中立的REST API接口。
- 支持一AJAX方式调用ActiveMQ
- ActiveMQ可以轻松地Web Service技术整合
- 可以被作为内存中的JMS提供者,非常适合JMD单元测试。
2.ActiveMQ基本概念
- 消息传送模型
- 点对点模型:使用队列作为消息通信载体,满足生产者与消费者模式。一条消息只能被一个消费者所使用,违背消费的消息在队列中保留知道被消费者消费。
- 发布、订阅模型:使用主题作为消息通信载体,类似于广播模式,发布者发布一条消息,该消息通过主题传递给所有的订阅者,在一天消息被广播之后才订阅的用户是收不到该消息的。
- 基本组件
- Broker消息代理:表示消息队列服务器实体,接口客户端连接,提供消息通信的核心服务
- Producer(消息生产者):业务的发起方,负责生产消息并传递给Broker
- Consumer(消息消费者):业务的处理方,负责从Broker获取消息并进行业务逻辑处理。
- Topic(主题):在发布订阅模式下消息的统一汇集地,不同的生产者向Topic发送消息,由Broker分发给不同的订阅者,实现消息的广播。
- Queue(队列):在点对点模式下特定生产者想特定队列发送消息,消费者订阅特定的队列接收消息并进行业务逻辑处理。
- Message(消息):根据不同的通信协议定义的固定格式进行编码的数据包,封装业务数据,实现消息的传输。
- 连接器
- 传输连接器:
用于在消息代理服务器与客户端之间通信。
在ActiveMQ示例的配置文件/examples/conf/activemq-demo.xml
<!--
The transport connectors expose ActiveMQ over a given protocol to
clients and other brokers. For more information, see:
http://activemq.apache.org/configuring-transports.html
-->
<transportConnectors>
<!-- Create a TCP transport that is advertised on via an IP multicast
group named default. -->
<transportConnector name="openwire" uri="tcp://localhost:61616" discoveryUri="multicast://default"/>
<!-- Create a SSL transport. Make sure to configure the SSL options
via the system properties or the sslContext element. -->
<transportConnector name="ssl" uri="ssl://localhost:61617"/>
<!-- Create a STOMP transport for STOMP clients. -->
<transportConnector name="stomp" uri="stomp://localhost:61613"/>
<!-- Create a Websocket transport for the websocket dmeo -->
<transportConnector name="ws" uri="ws://localhost:61614/" />
</transportConnectors>
传输连接器被定义在<transportConnectors>
元素中,一个元素顶一个特定的连接器,一个连接器必须有自己唯一的名字和uri属性,但是discoveryUri属性是可选的。
- VM:允许客户端和消息服务器直接在VM内部通信,采用的不是Socket连接,而是直接的虚拟机本地方法调用,从而避免网络传输开销。应用场景仅限于服务器和客户端在同一个JVM中。
- TCP:客户端通过TCP连接到远程的消息服务器
- UDP:客户端通过UDP连接到远程的消息服务器
- Multicast:允许使用组播传输的方式连接到消息服务器
- NIO:NIO和TCP的作用一样,只不过NIO使用了JAVA的NIO包,可能在某些场景下可以提高性能
- SSL:SSL允许用户在TCP的基础上使用SSL
- HTTP和HTTPS:允许客户端使用REST或AJAX的方式进行连接,意味着可以直接使用JavaScript向ActiveMQ发送消息
- WebSocket:允许客户端通过HTML5中的WebSocketl连接到消息服务器
- AMQP:从ActiveMQ5.8版本开始支持
- MQTT、STOMP:从ActiveMQ5.6版本开始支持
ActiveMQ还支持一些高级协议,也可以通过uri的方式进行配置: - Failover是一种重新连接的机制,工作于上面介绍的连接协议的上层,用于建立可靠的传输。其配置语法允许指定任意多个符合的uri,会自动选择其中一个尝试连接,如果没有连接成功,会继续选择其他的uri进行尝试。
- Fanout是一种重新连接和复制的机制,工作于其他连接协议的上层,采用复制的方式把消息复制到多台消息服务器上。
- 网络连接器:
网络连接器就是用来配置服务器之间的通信的。
<networkConnectors>
<networkConnector uri="static:(tcp://192.168.1.1:61617)"/>
</networkConnectors>
在A中配B那么就是A->B
在B中配A就是B->A,都配置了就是双向的。
- static(静态协议):用于为一个网络中的多个代理创建静态配置,这种配置协议支持符合的uri(即包含其他uri的uri)
- multicast(多点传送协议):消息服务器会广播自己的服务,也会定位其他代理。这种方式用于在服务器之间实现动态识别,而不是配置静态的IP组。
- 消息存储
- 存储到内存
- 存储到文件
- 存储到数据库
- AMQ基于文件并支持事务,以日志的形式进行持久化,实现了索引
- KahaDB基于文件支持事务,比AMQ更加好扩展和可恢复
- JDBC存储到数据库,建议结合Journal来存储,使用了快速的缓存写入技术,提高了性能
- 内存存储:需要设置消息服务器的JVM和内存大小
- LevelDB使用自定义索引代替常用的BTree索引,持久化性能高于KahaDB.
- 在ActiveMQ5.9中还提供了基于LevelDB和ZooKeeper的数据复制方式,作为主从方式的首选数据复制方案。