《消息队列的选型备考复习》由会员分享,可在线阅读,更多相关《消息队列的选型备考复习(13页珍藏版)》请在金锄头文库上搜索。
1、目录目录11消息队列的概述21.1消息的概念21.2消息的队列的概念21.3消息队列的概念32 AMQP42.1 AMQP42.2 AMQP历史42.3 AMQP的架构52.4 AMQP的概念53常用消息队列选型73.1 RabbitMQ73.2 ZeroMQ83.3 Qpid83.4 MetaQ93.5 ActiveMQ93.6 OpenMQ113.7 MemcacheQ124队列参数比较141 消息队列的概述1.1 消息的概念1. 消息的概念:消息是由通信双方所需要传递的信息,它可以是各式各样的媒体,如文本、声音、图像等消息,最终的理解方式为,消息传递的双方事先商定这样做的好处是:一是相当
2、于对数据进行了简单的加密,二采用自己定义的格式可以节省通信的传递量。2. 消息可以含有发送和接收者的标识,这样只有指定的用户才能看到只传递给他的信息和返回是否操作成功的回执。3. 消息也可以含有时间戳,以便接收方对某些与时间相关的应用进行处理消息,还可以含有到期时间,它表明如果在指定时间内消息还未到达则此消息作废,这主要用于与时间性关联较为紧密的应用。1.2 消息的队列的概念1. 存储的概念:消息队列是发送和接收消息的公用存储空间,它可以存在于内存中或者是物理文件中。2. 消息的发送方式:消息可以以两种方式发送,即快递方式和可恢复模式,它们的区别在于,快递方式为了消息的快速传递把消息放置于内存
3、中,而不放于物理磁盘上,以获取较高的处理能力;可恢复模式在传送过程的每一步骤中,都把消息写入物理磁盘中,以得到较好的故障恢复能力。3. 消息队列的存贮所在:可以放置在发送方、接收方所在的机器上,也可以单独放置在另外一台机器上。正是由于消息队列在放置方式上的灵活性,形成了消息传送机制的可靠性。当保存消息队列的机器发生故障而重新启动以后,以可恢复模式发送的消息,可以恢复到故障发生之前的状态,而以快递方式发送的消息则丢失了。另一方面,采用消息传递机制,发送方不要再担心接收方是否启动、是否发生故障等非必要因素,只要消息成功发送出去就可以认为处理完成。而实际上对方可能甚至未曾开机,或者实际完成时可能已经
4、是第二天了。4. 采用消息队列技术带来的好处是:由于是异步通信,无论是发送方还是接收方都不用等待对方返回成功消息就可以执行余下的代码,因而大大提高了事物处理的能力;在信息传送过程中,信息发送机制具有一定功能的故障恢复能力;消息传递机制使得消息通信的双方具有不同的物理平台成为可能。1.3 消息队列的概念1. 消息队列是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。2. 实现原理:是消息的发送者把自己想要发送的信息放入一个容器中(称为Message),然后把它保存至一个系统公用空间的消息队列中;本地或者是异地的消息
5、接收程序再从该队列中取出发给它的消息进行处理。2 AMQP2.1 AMQPAMQP 是 Advanced Message Queuing Protocol,即高级消息队列协议。和前面罗列的技术不同,AMQP 是一个标准化的消息中间件协议。她的理想是让不同语言,不同系统的应用互相通信,并提供一个简单统一的模型和编程接口。这样,人们就可以采用各种语言和平台来实现自己的应用,当需要和其他系统通信时,只要承认 AMQP 协议即可。2.2 AMQP历史AMQP 来自 JPMorgon,最初只是这个财大气粗的投行内部使用的消息中间件(注意:它变成了一个支持这个协议的标准实现)。发起人 John OHara
6、 很有气魄,他说“从 1996 年开始到 2003 我一直在等这样一个标准,但始终没有等到,我已经等不下去了”,并且“投行对这类标准的需求最迫切,而银行又从来不缺乏技术专家” ,所以他自己开发了一个。我想一个人如果想成就什么事,就需要这样的英雄气概吧。因为他的努力,AMQP 从金融界迅速推广到整个计算机行业,参与者包括了很多 IT 巨头。虽然今天 AMQP 依旧是一个草案,但值得我们拭目以待,AMQP 目前还是一个草案,最新版本是 0.102.3 AMQP的架构图2-1 AMQP架构2.4 AMQP的概念表2-1 AMQP概念表概念角色描述Producer消息生产者一个给exchange发送消
7、息的程序,发送方式大致是:它首先创建一个空消息,然后填上内容、路由KEY,最后发送给exchangeRouting Key正向过滤key、消息特征一个字符串,exchange用之来决定应该该消息投递给哪个queue。(开始时queue已向exchange绑定它所关心消息的routingKey)Exchange交换器接收来自producers的消息,并根据该消息的routingKey和绑定的routingKey,将该消息投递到正确的queuesBinding绑定操作前期将queue所想要的消息特征告诉exchange。Exchange以后收到消息,就按照这个规则来投递。QueueMQClient
8、在MQserver的直接面对在MQ server(实现为broker方式)里面的queue,持有MQ clients想要的消息。Consumer消息接收者是MQclient,从MQ server得到想要的消息,它负责创建、主动订阅、共享、使用、破坏queue和binding。表2-2 AMQP的exchange类型表Exchange路由行为Fan-Out对所有的queue进行广播Direct按照消息中的routingKEY直接路由TopicQueue向exchange绑定的routingKey命名为bindingKey,它可以采用通配符,如果具体消息中的routingKey与bindingKe
9、y相匹配,则把该消息交付给这个queue3 常用消息队列选型3.1 RabbitMQl 出身:RabbitMQ是由LShift提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的Erlang写成,因此也是继承了这些优点。l 架构:图3-1 RabbitMQ的架构virtual host:持有一组exchange、queue及bingding,可以做权限控制Queue:存放消息,由consumer建立,并绑定到ExchangeExchange:根据绑定的规则进行消息转发Binding:绑定规则l 架构模型:
10、消息代理架构Brokerl 特点: Erlang消息机制与AMQP极度吻合 高并发 时间检验的高可靠 高性能 集群易扩展 RabbitMQ虽然是天生的分布式消息队列,但其本身并不支持负载均衡 强大的管理功能 支持持久化、崩溃恢复。 消息延时是10ms级别3.2 ZeroMQl 出身:由imatix开发,并可以提供支持与培训。imatix是AMQP协议最初的creator,并开发了开源的OpenAMQ,但是在2010年imatix宣布iMatix to drop OpenAMQ support by 2011, AMQP it now believes it is “fundamentally
11、flawed and unfixable”. 目前主要将精力集中到ZeroMQ。l 架构: 无l 架构模型: C/S架构。 只是一个网络的library,用于编写分布式系统的利器。 部署起来非常简单,不需要单独的消息服务器来存储转发消息 重点放在消息的传输上,性能高于TCPof 0q。 不支持持久化、崩溃恢复,未来也不会支持,除非应用自己来做。 仅支持异步I/O,为了提高性能通过新建的线程发送消息 支持C, C+, Java, Python等20多种语言。 消息延时是微秒级别 集群要应用自己实现。3.3 Qpidl 出身:是 Apache Foundation 的一个开源项目,是一个 AMQP
12、 实现。它提供了 C+ 和 Java 两个版本的 broker,并支持多种语言的客户端,它还包括一个配置工具集l 架构: 无l 架构模型: 消息代理架构Brokerl 特点: 实现AMQP的基本功能。 容易集群 支持消息持久化 提供了很多额外的 HA 特性,非常适于集群环境下的消息通信。3.4 MetaQl 出身:淘宝通用产品-消息中间件团队开发,思路起源于LinkedIn的Kafka,但并不是Kafka的一个Copy,Meta相比于kafka的一个重要特性就是消息高可用方案的实现,我们称之为HA方案。l 架构: 无l 特点: 生产者、服务器和消费者都可分布 消息存储顺序写 性能极高,吞吐量大
13、 支持消息顺序 支持本地和XA事务 客户端pull,随机读,利用sendfile系统调用,zero-copy ,批量拉数据 支持消费端事务 支持消息广播模式 支持异步发送消息 支持http协议 支持消息重试和recover 数据迁移、扩容对用户透明 消费状态保存在客户端 支持同步和异步复制两种HA 支持group commit3.5 ActiveMQl 出身:ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中
14、间仍然扮演着特殊的地位l 架构:图3-2 ActiveMQ架构Queue Region就是P2P消息模型,Topic Region是Publish/Subscribe模型。Connectors负责消息通信,支持OpenWire, Stomp,REST,WS Notification, XMPP等协议。Network Services负责存储转发,集群等服务。Message Store负责消息的存储,支持内存、文件、内嵌数据库和外部数据库等四种消息持久化方式。l 特点: 多种语言和协议编写客户端。语言: Java, C, C+, C#, Ruby, Perl, Python, PHP。应用协议:
15、 OpenWire,Stomp REST,WS Notification,XMPP,AMQP 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务) 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性 通过了常见J2EE服务器(如Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA 支持通过JDBC和journal提供高速的消息持久化 从设计上保证了高性能的集群,客户端-服务器,点