消息中间件(一)---对比

   消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。

         消息中间件适用于需要可靠的数据传送的分布式环境。采用消息中间件机制的系统中,不同的对象之间通过传递消息来激活对方的事件,完成相应的操作。发送者将消息发送给服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接受者。

           消息中间件能在不同平台之间通信,它常被用来屏蔽掉各种平台及协议之间的特性,实现应用程序之间的协同,其优点在于能够在客户和服务器之间提供同步和异步连接,并且在任何时刻都可以将消息进行传送或者存储转发。这也是它比远程过程调用更进一步的原因。

           实现消息中间件的方式常用的是两种,一种是基于JMS,另一种是基于AMQP

JMS

        通常而言提到JMSJava MessageService)实际上是指JMS APIJMS是由Sun公司早期提出的消息标准,旨在为java应用提供统一的消息操作,包括createsendreceive等。JMS已经成为Java EnterpriseEdition的一部分。从使用角度看,JMS和JDBC担任差不多的角色,用户都是根据相应的接口可以和实现了JMS的服务进行通信,进行相关的操作。

        JMS通常包含如下一些角色:                 

Elements

Notes

JMS provider

实现了JMS接口的消息中间件,如ActiveMQ

JMS client

生产或者消费消息的应用

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中,消息路由非常简单,由producerconsumer链接到同一个queuep2p)或者topicpub/sub)来实现消息的路由。JMSconsumer同时支持message selector(消息选择器),通过消息选择器,consumer可以只消费那些通过了selector筛选的消息。在JMS兄中,消息路由机制的图示如下:


        常见的消息队列,大部分都实现了JMS API,可以担任JMS provider的角色,如ActiveMQRedis以及RabbitMQ等。

 AMQP

        AMQPadvanced message queuing protocol)在2003年时被提出,最早用于解决金融领不同平台之间的消息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binarywire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。这使得实现了AMQPprovider天然性就是跨平台的。意味着我们可以使用JavaAMQP provider,同时使用一个pythonproducer加一个rubbyconsumer。从这一点看,AQMP可以用http来进行类比,不关心实现的语言,只要大家都按照相应的数据格式去发送报文请求,不同语言的client均可以和不同语言的server链接。

        AMQP中,消息路由(messagerouting)和JMS存在一些差别,在AMQP中增加了Exchangebinding的角色。producer将消息发送给Exchangebinding决定Exchange的消息应该发送到那个queue,而consumer直接从queue中消费消息。queueexchangebindconsumer来决定。AMQProuting scheme图示过程如下:


      目前AMQP逐渐成为消息队列的一个标准协议,当前比较流行的rabbitmqstormmq都使用了AMQP实现。

     最后将JMSAMQP的各项对比如下:

 

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层的协议标准;天然具有跨平台、跨语言特性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值