ActiveMQ 特性:支持多种编程语言,支持多种传输协议,有多种持久化方式
支持的协议
- OpenWire (默认传输协议),是Apache的一种跨语言的协议,允许不同语言和平台访问ActiveMQ,是ActiveMQ4.x以后的默认传输协议
- AMQP
- Stomp
- MQTT (Message Queuing Telemetry Transport) 消息队列遥测传输是IBM开发的一个即时通讯协议,已成为物联网通信的标准;MQTT的结构简单,相当于其他消息协议,更加轻量级。适合计算能力有限,低带宽,不可靠的网络环境使用
- MQTT服务质量:QoS级别,一种关于发送者和接受者之间信息传递的保证协议。一共有3个级别至多一次(0),至少一次(1),只有2次(2)
- AUTO 自动检测协议 从ActiveMQ5.13.x开始,ActiveMQ开始支持协议格式检测,可以自动检测以上类型,允许客户端共享一共传输
支持的传输方式
- VM
- TCP
- SSL
- UDP
- Peer
- Multicast
- HTTP(s)
- Failover
- Fanout
- Discovery
- ZeroConf
协议连接配置
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?transport.trace=true&maximumConnections=1000&wireFormat.maxFrameSize=104857600" />
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
ActiveMQ持久化方案
ActiveMQ 的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用你在持久化方式,消息的存储逻辑都是一样的
- JDBC 方式 :保存到数据库,如Mysql,SQLServer Oracle DB2等;方便快捷,性能低
- AMQ 方式: 基于文件存储的方式,具有***写入快容易恢复的特点***,但是由于重建索引时间过长,从而导致索引文件占用磁盘空间过大,所以不推荐使用了;性能高于JDBC
- KahaDB 方式:从ActiveMQ 5.4开始默认的持久化方式,KahaDB恢复时间远远小于AMQ并且更少的数据文件,所以完全代替了AMQ
- LevelDB 方式:LeveDB是Google开发的一套用于持久化数据的高性能类库,LevelDB并不是一种服务,用户需要自行实现Server。是单进程的服务,能够处理十亿级别规模Key-values数据,占用内存小;支持数据快照,支持数据压缩,可以有序存储;
ActiveMQ事物实现机制
Producer 设置transacted:true,需要执行commit/rollback操作
Consumer 设置transacted:true, 触发操作消息重发,执行commit/rollback操作
消息对象相关
高可用集群
消费者功能
发布功能
- 消息游标机制
https://www.cnblogs.com/JPAORM/archive/2012/05/19/2509769.html- 在ActiveMQ 5.0之前,broker会把正在传输的消息保存在内存中。使用这种内存模型,当一个消费者消费消息的速度跟不上生产者生产消息的速度的时候,会是broker内存中维护的正在传输的消息数量迅速增长,最终到达最大限额。
当到达此最大限额后,broker就不能接受来自客户端的消息,这样生产者就会被阻塞直到broker的内存中有保存消息的空间为止。
从 5.0 版本开始,ActiveMQ,实现了一种新的内存模型以防止慢速的消费者阻塞运行速度更快的生产者。这种内存模型使用了消息游标。
- 消息消费确认优化
由于5.4.2对批处理优化的应答有一个默认超时,这确保了ack及时,即使用户很慢。
在慢速网络中,超时可能在达到批处理限制之前过期,因此会绕过利用率降低的带宽。
在5.6版本中,超时可以通过 optimizeAcknowledgeTimeOut 属性进行配置。通过连接的URI字符串或在连接工厂上设置超时时间。默认值是300ms,如果值为0则禁用。
需要设置optimizeAcknowledge为true,optimizeAcknowledgeTimeOut才会生效
- 生产者流量控制
https://blog.csdn.net/neareast/article/details/7581855]
在ActiveMQ5.0版本中,可以对生产者连接进行流量控制,当broker检测到目标超出限额时,生产者将会被阻塞直至资源可永久。
- 有序消息
通常,broker将保证同一生产者发送的所有消息的顺序。但是,由于broker使用多个线程处理,所以来自不同生产者的消息可能以不同的顺序到达不同的消费者。最后导致消息消费的顺序和发送的顺序不一致
ActiveMQ 支持严格顺序消息,启用严格顺序后,消息将按生产者发送是的顺序发送给消费者,但这会严重影响性能。
通过在activemq.xml中配置开启严格顺序
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">">
<dispatchPolicy>
<strictOrderDispatchPolicy/>
</dispatchPolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy
性能方面
事物机制
http://activemq.apache.org/should-i-use-transactions.html
http://activemq.apache.org/how-do-transactions-work.html
http://activemq.apache.org/should-i-use-xa.html