消息队列篇—经常使用消息队列MQ产品介绍及对比

MQ做为中间件,消息队列是分布式应用间交换信息的重要组件。消息队列可存储在内存和磁盘上,队列能够存储消息直至它们被应用程序接收。经过消息队列在应用程序不知道彼此位置的状况下能够独立处理信息或在处理消息前不须要等待接收该消息。全部消息队列能够解决应用解耦、异步消息等问题,是实现高性能、高可用、可伸缩和一致性架构中不可或缺的一环。spring


图片


目前业界有不少MQ产品,小编做以下对比:数据库


ZeroMQ:号称最快的消息队列系统,尤为针对大吞吐量的需求场景。扩展性好,开发比较灵活,采用C语言实现,实际上只是一个socket库的从新封装,若是作为消息队列使用,须要开发大量的代码。ZeroMQ仅提供非持久性的队列,也就是说若是down机,数据将会丢失。其中,Twitter的Storm中使用ZeroMQ做为数据流的传输。缓存


RabbitMQ:结合erlang语言自己的并发优点,支持不少的协议:AMQPXMPPSMTPSTOMP,也正是如此,使的它变的很是重量级,更适合于企业级的开发。性能较好,可是不利于作二次开发和维护。服务器


ActiveMQ: 历史悠久的开源项目,是Apache下的一个子项目。已经在不少产品中获得应用,实现了JMS1.1规范,能够和spring-jms轻松融合,实现了多种协议,不够轻巧(源代码比RocketMQ多),支持持久化到数据库,对队列数较多的状况支持很差,不过咱们的项目中并不会建不少的队列。网络


Redis:作为一个基于内存的K-V数据库,其提供了消息订阅的服务,能够看成MQ来使用,目前应用案例较少,且不方便扩展。对于RabbitMQRedis的入队和出队操做,各执行100万次,每10万次记录一次执行时间。测试数据分为 128Bytes、512Bytes、1K和10K四个不一样大小的数据。实验代表:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如 果数据大小超过了10K,Redis则慢的没法忍受;出队时,不管数据大小,Redis都表现出很是好的性能,而RabbitMQ的出队性能则远低于 Redis。架构


图片


RocketMQ: 阿里巴巴的MQ中间件,在其多个产品下使用,并可以撑住双十一的大流量,他并无实现JMS规范,使用起来很简单。部署由一个 命名服务(nameserver)和一个代理(broker)组成,nameserver和broker以及producer都支持集群,队列的容量受机器硬盘的限制,队列满后能够支持持久化到硬盘(也能够本身适配代码,将其持久化到NOSQL数据库中),队列满后会影响吞吐量,能够采用主备来保证稳定性,支持回溯消费,能够在broker端进行消息过滤。
并发


Jafka/Kafka:Kafka是Apache下的一个子项目,是一个高性能跨语言分布式Publish/Subscribe消息队列系统,而Jafka是在Kafka 之上孵化而来的,即Kafka的一个升级版。异步


具备如下特性:快速持久化,能够在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既能够 达到10W/s的吞吐速率;彻底的分布式系统,BrokerProducerConsumer都原生自动支持分布式,自动实现复杂均衡;支持 Hadoop数据并行加载,对于像Hadoop的同样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka经过 Hadoop的并行加载机制来统一了在线和离线的消息处理,这一点也是本课题所研究系统所看重的。socket


Apache Kafka相对于ActiveMQ是一个很是轻量级的消息系统,除了性能很是好以外,仍是一个工做良好的分布式系统。分布式


针对消息中间件的选择能够从如下方面进行考虑,以ActiveMQRocketMQ对比做为案例。


优先级:咱们的项目对此需求不是特别明显,RocketMQ须要新建一个特殊队列来接收优先级高的队列,没法实现从0-65535这种细粒度的控制,ActiveMQ能够精细控制。


顺序:咱们的消息总线中的消息应该都是无状态的,因此对消息的处理顺序没有严格的要求,若是有特殊要求的话能够在业务层进行控制,activeMQ没法保证严格的顺序,RocketMQ能够保证严格的消费顺序。


持久化:都支持


稳定性:RoketMQ在稳定性上可能更值得信赖,支持多种集群方案。


消息过滤:ActiveMQ仅支持在客户端消费的时候进行判断是不是本身须要的消息,RocketMQ能够在broker端进行过滤,对于咱们的消息总线,这里能够节省大量的网络传输是否会有消息重发形成的重复消费:RocketMQ能够保证,ActiveMQ没法保证。


回溯消费:即从新将某一个时刻以前的消息从新消费一遍,咱们对于这种需求应该不多,RocketMQ支持,ActiveMQ不支持(RocketMQ的队列是持久化到硬盘的,按期进行清除。


事务:都支持


定时消费:RocketMQ支持


消息堆积:就是当缓存消息的内存满了以后的解决方案,一种是丢弃策略,这种不会影响吞吐量,还有一种就是将消息持久化到磁盘,这种会影响吞吐量,在评估影响程度上,RocketMQ的成绩稍微好一点。


客户端不在线:RocketMQ能够在客户端上线后继续将未消费的消息推送到客户端。

相关文章
相关标签/搜索