消息队列 | 开发语言 | 协议支持 | 设计模式 | 持久化支持 | 事务支持 | 负载均衡支持 | 功能特色 | 缺点 |
RabbitMQ | Erlang | AMQP,XMPP,SMTP,STOMP | 代理(Broker)模式(消息在发送给客户端时先在中心队列排队) | 支持持久化到文件 | 不支持 | 支持 | 性能较好;管理界面较丰富;在互联网公司有较大规模的应用;数据库 设计的核心是保证消息正确递交(认为消费者是一直处于活动状态去消费消息的),设计模式 所以设计的比较重,须要记录不少状态并发 |
虽然产品开源,但Erlang语言应用不够广泛;负载均衡 集群不支持动态扩展框架 |
ZeroMQ | C++ | ZeroMQ是一个并发框架作的socket库socket (是一个传输层API库),并非真正的消息队列/消息中间件性能 |
点对点模式,经过引用ZeroMQ程序库,编码 在应用之间发送消息,任何应用程序节点均可做为一个MQspa |
不支持 | 不支持 | 不支持 | 低延时,高性能,最高每秒43万条消息 | 非持久性队列,宕机后数据将会丢失 |
ActiveMQ | Java | OpenWire,Stomp REST,WS Notification,XMPP,AMQP,JMS | 支持代理模式,也支持点对点模式 | 支持持久化到文件或数据库 | 支持 | 支持 | 成熟的产品,在不少公司获得应用;有较多的文档;各类协议支持较好,设计 有多种语言的成熟的客户端;彻底支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务);支持Spring,能够很容易内嵌到使用Spring的系统里 |
根据其余用户反馈,会出现丢失消息的问题; 其重心已放到下一代产品Apollo,目前社区不够活跃,对 5.x 维护较少 |
关于消息队列之间的通讯问题,能够经过采用ActiveMQ的Broker Cluster集群方式实现,ActiveMQ的集群方式主要由两种:Master Slave和Broker Cluster。一、Master Slave集群方式:Master提供服务,Slave实时备份Master的数据,以保证消息的可靠性。当Master失效时,Slave自动升级为Master,客户端自动链接到Slave;二、Broker Cluster集群方式:在多个ActiveMQ实例之间进行消息的路由。如:生产者应用链接一个ActiveMQ实例,称为MQ1,全部消息都由该实例提供。两个消费者应用分别链接另外两个ActiveMQ实例,分别为MQ2和MQ3,两个消息消费者须要消费MQ1上的消息,但它们链接的都不是MQ1,能够经过该集群方式方式把MQ1上的消息路由到MQ2和MQ3。Broker Cluster的集群分为Static Discovery和Dynamic Discovery两种。(1)Static Discovery 方式:经过硬编码的方式使用全部已知ActiveMQ实例节点的URI地址。为了保证消费者不因某个节点的失效而致使不能消费消息,在消费者应用中须要配置全部节点的URI。这种静态路由存在的缘由多是由于静态处理的方式使路由速度更快。(2)Dynamic Discover 方式:在配置ActiveMQ实例时,不须要知道全部其它实例的URI地址,只需在全部实例的配置文件中进行相应设置,就能够实现消息在全部ActiveMQ实例之间进行路由。Master Slave模式不支持负载均衡,但能够经过消息的实时备份或共享,保证消息服务的可靠性;Broker Cluster模式支持负载均衡,能够提升消息的消费能力,但不能保证消息的可靠性。因此为了支持负载均衡,同时又保证消息的可靠性,能够采用Msater Slave与Broker Cluster相结合的模式。