ActiveMQ
ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线,并且它是一个完全支持JMS规范的消息中间件。其丰富的API、多种集群构建模式使得他成为业界老牌消息中间件,在中小型企业中应用广泛!
当然现在可能用的相对比较少了,因为ActiveMQ性能和其他的主流MQ相比是比较一般的,早期在传统行业为王的时代它是比较流行的,现如今对于一些高并发、大数据的应用场景随处可见,在MQ的选择上如果再使用ActiveMQ往往就比较力不从心了。
使用说明
MQ衡量指标:服务性能、数据存储、集群架构
ActiveMQ它的性能不是特别的好,面对超大规模的并发时,就有可能出现各种各样的小问题,比如阻塞、消息堆积过多、产生一些延迟等等。
从数据存储来看ActiveMQ采用 KahaDB
这种存储方式作为默认的持久化方案。当然也可以选择使用高性能的Google的 LevelDB
这种基于内存的,或者说想要保证消息百分百可靠的话也可以选择一些关系型数据库如 MySQL
ActiveMQ流行了这么多年,其API包括相关的组件以及集成都是非常的完善的。所以说如果不是特别大的并发场景下,ActiveMQ也是比较不错的选择。其集群架构模式也非常不错。
集群架构模式
ActiveMQ最简单的分为两种集群架构模式,一种是 Master-Slave
模式,即主备模式(左图)。它利用 zookeeper
进行两个节点之间的协调,也有可能是更多的节点,其中有一个是主节点,它是对外提供服务的,另外的节点启动但是不对外提供服务。当主节点挂掉时,利用 zookeeper
进行高可用的切换,把 slave
节点切换成主节点,继续对外提供服务。
还有一种集群模式是 NetWork
模式(右图),它其实本质上就是两组主备模式的集成,然后中间用网关进行连接配置,就可以实现分布式的集群了。
Kafka
Kafka是LinkedIn开源的分布式发布订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。
使用说明
kafka最初设计时就是面向大数据方向的,主要用于日志收集,所以在使用kafka时,要注意业务是否允许出现消息重复、丢失、错误等问题,如果允许那使用kafka是性能最高的。它能够在廉价的服务器上也能支持单机每秒100k条数据以上的吞吐量。
kafka的高性能读写主要是借力于操作系统底层的提供的 PageCache
功能。而且kafka完全没有进行内存和磁盘的数据同步的烦恼,它仅仅使用内存的存储。只要你有足够的内存就能承载很大的数据。
集群架构模式
kafka的集群模式也依赖于 zookeeper
,让zookeeper进行节点的协调和管理。每个kafka节点之间可以进行 replicate
(副本的复制),对于某个节点的数据会依次同步到集群的其他节点上,这样只要部署方案合理,即使某个节点挂掉,其他节点的数据也依然存在。
RocketMQ
RocketMQ是阿里开源的消息中间件,目前也已经孵化为Apache顶级项目,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。
使用说明
RocketMQ在早期2.X版本也是使用zookeeper做协调,在后续3.X版本中放弃了使用zookeeper,而是自行实现了一套 Name Server
去做集群之间的管理和协调工作。
RocketMQ的特点在于它能够保障消息的顺序性,提供了丰富的消息拉取和处理模式,支持订阅者进行水平扩展,实时消息订阅的机制,以及它能承载上亿级别的消息堆积能力。
它的集群架构也有很多种,比如 Master-Slave
模式,双Master模式、双主双从(2M2S)模式,多主多从模式。它的集群架构可选的方案是非常多的。而且RacketMQ刷盘策略也很多,比如说同步刷写、异步复制。它的存储方式借鉴了很多优秀的开源技术,比如zerocopy、linux的ext4文件系统等。
集群模型
左边和右边分别是生产者集群和消费者集群, Name Server
就是自行实现的用于替代zookeeper的程序。中间就是两主两从服务集群,可以实现主从的自动切换,数据之间也可以采用 replicate
机制。
当然这些优秀的机制在Apache RocketMQ项目里面其实是不提供的,比如还有解决分布式事务使用MQ进行解耦,为什么没有呢?因为阿里的RocketMQ商业版是收费的,需要购买相关的产品才可以使用到这些功能。所以这也是使用RocketMQ的一个痛点。
RabbitMQ
RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
使用说明
RabbitMQ它的性能虽然不及kafka,但是要比ActiveMQ高出很多,而且可以做一些性能优化。并其可靠性和安全性非常好,数据可以保证百分百不丢失。RabbitMQ集群可以构建很多组,实现异地双活架构。每一个节点存储方式可以采用内存(ram)或者磁盘(disk),所以是非常灵活的。
集群模式
图中显示的是三个RabbitMQ节点作为一组集群,当然也可以有很多组。节点之间呢采用 Mirror Queue
(镜像队列)的方式,基于这种方式可以保证数据百分百不丢失。前端可以进行一个负载均衡,例如 HA-proxy
进行TCP级别的负载,配合 keepAlived
做一个高可用的配置。前端增加一个虚拟的VIP,通过访问VIP让请求路由到一个负载均衡组件,然后再往下路由到一个RabbitMQ节点。
这就是整个RabbitMQ的集群架构,它能够实现非常完善、非常高可用、并且性能也非常好,而且稳定性超强。它有各种各样的集群恢复的手段,比如节点挂点了、甚至是磁盘损坏了它也能去进行修复。这是RabbitMQ非常好的一个点。