初次接触消息队列时,在网上搜索,老是会提到如JMS、AMQP等一些术语。查看了一些文档,对JMS和AMQP的一些理解记录以下。java
一般而言提到JMS(Java MessageService)其实是指JMS API。JMS是由Sun公司早期提出的消息标准,旨在为java应用提供统一的消息操做,包括create、send、receivepython
等。JMS已经成为Java Enterprise Edition的一部分。从使用角度看,JMS和JDBC担任差很少的角色,用户都是根据相应的接口能够和实现了JMS的服务进行通讯,进行相关的操做。spring
JMS一般包含以下一些角色: api
Elements网络 |
Noteside |
JMS providerui |
实现了JMS接口的消息中间件,如ActiveMQspa |
JMS clientorm |
生产或者消费消息的应用server |
JMS producer/publisher |
JMS消息生产者 |
JMS consumer/subscriber |
JMS消息消费者 |
JMS message |
消息,在各个JMS client传输的对象; |
JMS queue |
Provider存放等待被消费的消息的地方 |
JMS topic |
一种提供多个订阅者消费消息的一种机制;在MQ中经常被提到,topic模式。 |
JMS提供了两种消息模型,peer-2-peer(点对点)以及publish-subscribe(发布订阅)模型。当采用点对点模型时,消息将发送到一个队列,该队列的消息只能被一个消费者消费。而采用发布订阅模型时,消息能够被多个消费者消费。在发布订阅模型中,生产者和消费者彻底独立,不须要感知对方的存在。
消息如何从producer端达到consumer端由message-routing来决定。在JMS中,消息路由很是简单,由producer和consumer连接到同一个queue(p2p)或者topic(pub/sub)来实现消息的路由。JMSconsumer同时支持message selector(消息选择器),经过消息选择器,consumer能够只消费那些经过了selector筛选的消息。在JMS兄中,消息路由机制的图示以下:
常见的消息队列,大部分都实现了JMS API,能够担任JMS provider的角色,如ActiveMQ,Redis以及RabbitMQ等。
AMQP(advanced message queuing protocol)在2003年时被提出,最先用于解决金融领不一样平台之间的消息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binary wire-level protocol(连接协议)。这是其和JMS的本质差异,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。这使得实现了AMQP的provider自然性就是跨平台的。意味着咱们可使用Java的AMQP provider,同时使用一个python的producer加一个rubby的consumer。从这一点看,AQMP能够用http来进行类比,不关心实现的语言,只要你们都按照相应的数据格式去发送报文请求,不一样语言的client都可以和不一样语言的server连接。
在AMQP中,消息路由(messagerouting)和JMS存在一些差异,在AMQP中增长了Exchange和binding的角色。producer将消息发送给Exchange,binding决定Exchange的消息应该发送到那个queue,而consumer直接从queue中消费消息。queue和exchange的bind有consumer来决定。AMQP的routing scheme图示过程以下:
目前AMQP逐渐成为消息队列的一个标准协议,当前比较流行的rabbitmq、stormmq都使用了AMQP实现。
最后将JMS和AMQP的各项对好比下:
|
JMS |
AMQP |
定义 |
Java api |
Wire-protocol |
跨语言 |
否 |
是 |
跨平台 |
否 |
是 |
Model |
提供两种消息模型: (1)、Peer-2-Peer (2)、Pub/sub |
提供了五种消息模型: (1)、direct exchange (2)、fanout exchange (3)、topic change (4)、headers exchange (5)、system exchange 本质来说,后四种和JMS的pub/sub模型没有太大差异,仅是在路由机制上作了更详细的划分; |
支持消息类型 |
多种消息类型: TextMessage MapMessage BytesMessage StreamMessage ObjectMessage Message (只有消息头和属性) |
byte[] 当实际应用时,有复杂的消息,能够将消息序列化后发送。 |
综合评价 |
JMS 定义了JAVA API层面的标准;在java体系中,多个client都可以经过JMS进行交互,不须要应用修改代码,可是其对跨平台的支持较差; |
AMQP定义了wire-level层的协议标准;自然具备跨平台、跨语言特性。 |
参考文档:
一、 http://en.wikipedia.org/wiki/AMQP
二、 http://en.wikipedia.org/wiki/Java_Message_Service
三、 http://www.bytespring.com/blog/understanding-differences-between-amqp-and-jms