一、主流消息中间件介绍
-
ActiveMQ
简介:Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件;由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行
ActiveMQ 完全支持JMS规范的消息中间件,API丰富,多种集群构建模式,多用于中小型企业,不适用高并发应用
-
KAFKA
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息
0.8版本之后支持复制,不支持事务,对消息的重复,丢失,错误没有严格的要求,多用于大量数据的互联网服务的数据收集业务
-
RocketMQ
RocketMQ思路起源于kafka ,它对消息的可靠传输和事务性做了优化,目前在阿里集团被广泛应用于交易,充值,流计算,消息推广,日志流式处理,binglog分发等场景
RocketMQ是阿里开源的消息中间件,目前已经孵化成Apache顶级项目,它是纯java开发,具有高吞吐量,高可用性,适用大规模分布式系统,有很多集群模式可供选择
-
rabbitMQ
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
Rabbit科技有限公司开发了RabbitMQ,并提供对其的支持。起初,Rabbit科技是LSHIFT和CohesiveFT在2007年成立的合资企业,2010年4月被VMware旗下的SpringSource收购。RabbitMQ在2013年5月成为GoPivotal的一部分。
各大消息中间件对比图
MQ 衡量指标
服务性能,数据存储,集群架构
二、RabbitMQ优点
RabbitMQ底层采用Erlang语言进行编写,数据复制的延迟低
开源,性能优秀,稳定性保障
集群模式丰富,表达式配置,HA模式,镜像队列模型,保证数据不丢失的前提下做到高可靠 性,可用性,提供可靠性消息投递模式(confirm) 、返回模式(return)
相对java,RabbitMQ与springAMQP完美的整合,API丰富
三、RabbitMQ缺点
基于erlang开发,很难去看懂源码,不利于做二次开发和维护。
RabbitMQ相比其他消息中间件,吞吐量会低,学习和维护成本较高
四、RabbitMQ使用场景
对数据的一致性,稳定性,可靠性要求很高的应用,对性能和吞吐量的要求相对较低
五、 集群模型
六、AMQP
AMQP全称:Advanced Message Queuing Protocol (高级消息队列协议)
AMQP定义
是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
AMQP协议模型图
publisher: 生产者 consumer: 消费者 server: mq服务
virtual host: 虚拟主机 exchange: 交换机 message queue: 消息队列
生成者将消息投递到交换机中,交换机根据路由键将消息路由到匹配的队列中,消费者监听队列获取消息
AMQP核心概念
server : 又称(Broker) ,接受客户端的连接,实现AMQP实体服务
Connection : 连接 ,应用程序与Broker的网络连接
Channel : 网络信道,几乎所有的通道都在Channel中进行,Channel是进行消息读写的通道,客户端可以建立多个Channel,每个Channel代表一个会话任务**
Message : 消息,服务器和应用程序之间传送的数据,由Properties和Body组成,Properties可以对消息进行修饰,比如消息的优先级,延迟等高级特性,Body则是消息体的内容
Virtual Host : 虚拟主机(地址),用于进行逻辑隔离,最上层的消息路由,一个Virtual Host里面可以有若干个Exchange和Queue,同一个Virtual Host里面不能有相同名称的Exchange和Queue
Exchange : 交换机,接受消息,根据路由键转发到绑定的队列
Binding : Exchange和Queue之间的虚拟连接,binding中可以包含多个routing key
routing key: 一个路由规则,一个虚拟机可以用它确定如何路由一个特定消息
Queue:也称为Message Queue, 消息队列,保存消息并将它们转发给消费者
RabbitMQ 消息流转图示
一个交换机可以binding 多个消息队列 ,消息具体流转到的队列由 routingKey 来决定