简介
ActiveMQActiveMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。
ActiveMQ使用Apache提供的授权,任何人都可以对其实现代码进行修改。
ActiveMQ的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件。
ActiveMQ实现了JMS标准并提供了很多附加的特性。
这些附加的特性包括:
JMX管理(java Management Extensions,即java管理扩展),
主从管理(master/salve,这是集群模式的一种,主要体现在可靠性方面,当主中介(代理)出现故障,那么从代理会替代主代理的位置,不至于使消息系统瘫痪)、消息组通信(同一组的消息,仅会提交给一个客户进行处理)、有序消息管理(确保消息能够按照发送的次序被接受者接收)。消息优先级(优先级高的消息先被投递和处理)、订阅消息的延迟接收(订阅消息在发布时,如果订阅者没有开启连接,那么当订阅者开启连接时,消息中介将会向其提交之前的,其未处理的消息)、接收者处理过慢(可以使用动态负载平衡,将多数消息提交到处理快的接收者,这主要是对PTP消息所说)、虚拟接收者(降低与中介的连接数目)、成熟的消息持久化技术(部分消息需要持久化到数据库或文件系统中,当中介崩溃时,信息不会丢失)、支持游标操作(可以处理大消息)、支持消息的转换、通过使用Apache的Camel可以支持EIP、使用镜像队列的形式轻松的对消息队列进行监控等。
消息处理机制
ActiveMQ的queue以及topic两种消息处理机制分析
topic
Publish Subscribe messaging 发布订阅消息
quene
Point-to-Point 点对点
有无状态
topic数据默认不落地,是无状态的。
Queue数据默认会在mq服务器上以文件形式保存,比如Active MQ一般保存在$AMQ_HOME\data\kr-store\data下面。也可以配置成DB存储。完整性保障
topic 并不保证publisher发布的每条数据,Subscriber都能接受到。
Queue保证每条数据都能被receiver接收是否会丢失
一般来说publisher发布消息到某一个topic时,只有正在监听该topic地址的sub能够接收到消息;如果没有sub在监听,该topic就丢失了。
Sender发送消息到目标Queue,receiver可以异步接收这个Queue上的消息。Queue上的消息如果暂时没有receiver来取,也不会丢失。消息发布接收策略
topic 一对多的消息发布接收策略,监听同一个topic地址的多个sub都能收到publisher发送的消息。Sub接收完通知mq服务器
quene 一对一的消息发布接收策略,一个sender发送的消息,只能有一个receiver接收。receiver接收完后,通知mq服务器已接收,mq服务器对queue里 的消息采取删除或其他操作。
Topic和queue的最大区别在于topic是以广播的形式,通知所有在线监听的客户端有新的消息,没有监听的客户端将收不到消息;而queue则是以点对点的形式通知多个处于监听状态的客户端中的一个。
部署方式
单点
单个MQ存在单点故障。
Master-slave模式
同时在链接串中增加failover功能, 能够实现HA, 避免单点故障。
但是,Master-slave方式一般需要”共享文件系统”,同时必须保证出现问题时,文件锁能正常切换。
另外,slave处于stand by状态,不对外提供服务。 在Master高负荷的情况下,Slave不能提供能帮助。
如果Master在高负荷情况下挂掉,那么Slave在同样的情况下也可能挂掉,只是时间问题。( Replicate Leveldb 方案也存在上述问题)。
network模式
另外,activemq 还有network模式,但此模式的应用场景不是很明确。
实现 “高性能”,“高可用”,“可扩展”的MQ集群方案
多个Activemq broker 同时工作
通过上面的分析, 简单的采用Activemq官网上提供的方案基本上不能满足生产系统的性能和高可用要求。因此,必须对上述方案进行改进,实现 “高性能”,“高可用”,“可扩展”的MQ集群方案。
同时部署多个Activemq broker实例, 多个Activemq broker实例同时工作。单个broker实例,生产和消费消息的速度在1万条/秒,部署N个Broker, 整个消息通道就能拓宽N倍;
多个(4个以上)broker 实例同时工作,其中1到2个mq实例出现问题时,消息可经过其他broker处理,整个系统依然可以健康工作,从而实现高可用。
https://blog.csdn.net/guzicheng/article/details/44591651
从以上的分析可以看出,Master-Slave模式不支持负载均衡,但可以通过消息的实时备份或共享保证消息服务的可靠性,Broker Cluster模式支持负载均衡,可以提高消息的消费能力,但不能保证消息的可靠性。
所以为了支持负载均衡,同时又保证消息的可靠性,我们可以采用Msater-Slave+Broker Cluster的模式。
activeMQ支持的数据类型
- 纯字符串的数据
session.createTextMessage(); - 序列化的对象
session.createObjectMessage(); - 流,可以用来传递文件等
session.createStreamMessage(); - 用来传递字节
session.createBytesMessage(); - 这个方法创建出来的就是一个map,可以把它当作map来用,当你看了它的一些方法,你就懂了
session.createMapMessage(); - 这个方法,拿到的是javax.jms.Message,是所有message的接口
session.createMessage();