MQ(消息队列)简介

一:概念
MQ(message queue):MQ是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。
消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。

二:AMQP协议介绍
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
AMQP在消息提供者和客户端的行为进行了强制规定,使得不同卖商之间真正实现了互操作能力。

三:JMS协议介绍
JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。
详情请移步至另一篇文章:http://blog.csdn.net/ruben95001/article/details/78363043

四:STOMP协议介绍
STOMP,Streaming Text Orientated Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。
它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互,类似于OpenWire(一种二进制协议)。其中最流行的STOMP消息代理是Apache ActiveMQ。
博主最初接触到的MQ就是ActiveMQ,当时的业务需求就是,要求用户通过WeChat的微信系统与我司研发的一款APP之间进行相互通信。起初博主当时打算是用第三方的服务,例如环信,但是在熟读其文档后,发现与你用户体系有些不一致。便开始独立研发一套独立的通信系统,基于ActiveMQ。

五:MQ基本概念
1:消息(Message)
消息是MQ中最小的概念,本质上就是一段数据,它能被一个或者多个应用程序所理解,是应用程序之间传递的信息载体。
2:队列(Queue)
2.1:本地队列
本地队列按照功能可划分为初始化队列,传输队列,目标队列和死信队列。
2.1.1:初始化队列用作消息触发功能。
2.1.2:传输队列只是暂存待传的消息,条件许可的情况下,通过管道将消息传送到其他的队列管理器。
2.1.3:目标队列是消息的目的地,可以长期存放消息。
2.1.4:如果消息不能送达目标队列,也不能再路由出去,则被自动放入死信队列保存。
2.2:别名队列&远程队列
只是一个队列定义,用来指定远端队列管理器的队列。使用了远程队列,程序就不需要知道目标队列的位置。
2.3:模型队列
模型队列定义了一套本地队列的属性结合,一旦打开模型队列,队列管理器会按照这些属性动态地创建出一个本地队列。
3:队列管理器(Queue Manager)
队列管理器是一个负责向应用程序提供消息服务的机构,如果把队列管理器比作数据库,那么队列就是其中一张表。
4:通道(Channel)
通道是两个管理器之间的一种单向点对点的的通信连接,如果需要双向交流,可以建立一对通道。
5:监听器(listner)

六:MQ产品的特性
6.1:可靠性传输
对于应用来说,只要成功把数据提交给消息中间件,那么关于数据可靠传输的问题就由消息中间件来负责。
6.2:不重复传输
不重复传播也就是断点续传的功能,特别适合网络不稳定的环境,节约网络资源。
6.3:异步性传输
异步性传输是指,接受信息双方不必同时在线,具有脱机能力和安全性。
6.4:消息驱动
接到消息后主动通知消息接收方。
6.5:支持事务
目前MQ也广泛被一些企业用于对于分布式事务的同步。

7:常用的场景
7.1:消息通道
例如博主之前运用的场景就是把MQ作为一种消息通道在APP与微信之间进行一对一或发布/订阅式的通信。其机制入下:
MQ(消息队列)简介_第1张图片
7.2:消息总线机制
在如今的SOA架构活着微服务架构中,这普遍使用,例如上面谈到的事务的同步问题。各个服务之间的通信,可以确保数据的一致性。
机制如下:
MQ(消息队列)简介_第2张图片

八:常见的MQ对比
8.1:RabbitMQ
是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了一个经纪人(Broker)构架,这意味着消息在发送给客户端时先在中心队列排队。对路由(Routing),负载均衡(Load balance)或者数据持久化都有很好的支持。
8.2:ActiveMQ
是Apache下的一个子项目。 类似于ZeroMQ,它能够以代理人和点对点的技术实现队列。同时类似于RabbitMQ,它少量代码就可以高效地实现高级应用场景。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多种语言客户端 C++、Java、.Net,、Python、 Php、 Ruby等。
8.3:Kafka
Kafka是Apache下的一个子项目,是一个高性能跨语言分布式Publish/Subscribe消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。具有以下特性:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现复杂均衡;支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka通过Hadoop的并行加载机制来统一了在线和离线的消息处理,这一点也是本课题所研究系统所看重的。Apache Kafka相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。
8.4:RocketMQ
RcoketMQ 是一款低延迟、高可靠、可伸缩、易于使用的消息中间件。具有以下特性:
1.支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型
2.在一个队列中可靠的先进先出(FIFO)和严格的顺序传递
3.支持拉(pull)和推(push)两种消息模式
4.单一队列百万消息的堆积能力
5.支持多种消息协议,如 JMS、MQTT 等
6.分布式高可用的部署架构,满足至少一次消息传递语义
7.提供 docker 镜像用于隔离测试和云集群部署
详细信息请跳转:http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/

你可能感兴趣的:(Message)