消息中间件的比较-转载

标签: 转载文章 | 发表时间:2012-06-14 22:44 | 作者:人月神话
出处:http://blog.sina.com.cn/cmmi
原文: http://www.orientware.org/viewArticles.do?action=browse&columnId=29&id=22&flag=home

消息中间件(message oriented middleware)是指支持与保障分布式应用程序之间同步/异步收发消息的中间件。消息是分布式应用之间进行数据交换的基本信息单位,分布式应用程序之间的通信接口由消息中间件提供。其中,异步方式指消息发送方在发送消息时不必知道接收方的状态,更无需等待接收方的回复,而接收方在收到消息时也不必知道发送方的目前状态,更无需进行同步的消息处理,它们之间的连接完全是松耦合的,通信是非阻塞的,这种异步通信方式是由消息中间件中的消息队列及其服务机制保障的。一般地,实时性要求较高的业务采用同步方式处理,实时性要求不高的业务采用异步方式进行处理。消息中间件已广泛应用于各类分布式应用系统中。

消息起源于分布式操作系统进程通信模型和分布式应用互操作技术的研究。1980年代,随着开放系统互连参考模型OSI的兴起,作为开放系统网络模式中底层的包交换通信范型的一种自然扩充,分布式系统消息机制的研究和应用得到极大的发展,而统一处理消息发送、接收和管理的消息中间件的概念和平台开始出现。1980年代后期,IBM公司推出了消息中间件产品MQSeries,成为消息中间件成熟的一个标志。

进入1990年代,由于应用需求的推动,消息中间件技术得到极大的发展,并在世界范围内涌现出大量的消息中间件产品。为了有助于消息中间件技术的传播,由众多消息中间件厂商、用户和咨询机构组成了消息中间件协会(MOMA),MOMA是一个非盈利机构,旨在推动消息技术在跨平台、跨层次的分布计算中的广泛应用。国际对象管理组织(Object Management Group,简称OMG)制定了公共对象服务标准(Common Object Service Specifiaction,简称COSS),其中对消息服务进行了规范。

进入21世纪,消息中间件技术得到进一步的发展。在规范化方面,由于J2EE技术的广泛应用,J2EE的消息服务规范JMS(Java Message Service)得到消息中间件厂商的广泛采纳,并逐渐成为消息中间件的事实标准,与此同时,Web服务技术的兴起,与Web服务相关的标准体系得到发展,在消息方面,W3C组织定义了Web服务的可靠消息传送规范(WS-ReliableMessaging)。

目前,企业信息系统开始从部门级应用向企业级、跨企业集成的方向转变,在这一过程中,传统的消息中间件体系架构也暴露出它的局限性。传统的消息中间件通常采用点对点的消息传输结构,即在发送方对消息进行打包时需要显明地标注接收方的地址。因此,尽管消息的接收方和发送方是松耦合连接的,相互通信不必保持同步,但由于在消息中必须绑定接收方地址,导致在广域、大型应用系统中使用消息中间件不够灵活,系统扩展比较困难。为了增加消息发送方和接收方之间对地址的透明性,1990年代末期以后,消息中间件开始向发布/订阅架构转变,并成为企业应用集成中间件的一种核心机制,而基于发布/订阅架构的消息中间件通常称为发布/订阅消息中间件(Publish/Subscribe Middleware,简称P/S MOM)或消息代理(Message Broker),以与传统的消息中间件相区别。目前比较典型的消息中间件包括IBM WebSphere MQSeries、Tibco TIB/Rendezvous和Microsoft MSMQ等。

传统的点对点消息中间件通常由消息队列服务、消息传递服务、消息队列和消息应用程序接口API组成,其典型的结构如图6.1所示。



消息中间件的基本工作原理为:在消息发送方,消息发送者调用发送消息的API函数,将需要发送的消息经消息队列服务存储到发送消息队列中;通过双方消息传递服务之间的交互,经消息队列服务将需要发送的消息从发送队列取出,并送到接收方;接收方再经它的消息队列服务将接收到的消息存放到它的接收消息队列中;在消息接收方,消息接收者调用接收消息的API函数,同样经过消息队列服务,将需要的消息从接收队列中取出,并进行处理。消息在发送或接收成功后,消息队列服务将对相应的消息队列进行管理。

在基于消息代理的分布式应用系统中,消息的发送方称为出版者,消息的接收方称为订阅者,不同的消息通过不同的主题进行区分。出版者向消息代理出版其他应用系统感兴趣的消息,而订阅者从消息代理接收自己感兴趣的消息,出版者和订阅者之间通过消息代理进行关联。消息代理的基本结构如图6.2所示。




消息代理具有很好的灵活性和可扩展性,并支持主动、实时的信息传递方式,当消息发布者有动态更新的数据产生时,消息代理会通过事件的发布主动通知消息订阅者存在新的数据可用,而无需消息订阅者进行频度无法确定的查询。消息代理适合于具有实时性、异步性、异构性、动态性和松耦合的应用需求。

消息代理的工作原理为:消息发布者和订阅者分别同消息代理进行通信。消息发布者将包含主题的消息发布到消息代理;消息订阅者向消息代理订阅自己感兴趣的主题。消息代理对双方的主题进行匹配后,不断将订阅者感兴趣的消息推(Push)给订阅者,直到订阅者向消息代理发出取消订阅的消息。

消息代理实现了发布者和订阅者在时间、空间和流程三个方面的解耦:

  • 时间解耦—-发布方和订阅方无需同时在线就能够进行消息传输,消息中间件通过存储转发提供了这种异步传输的能力;
  • 空间解耦——发布方和订阅方都无需知道对方的物理地址、端口,甚至无需知道对方的逻辑名字和个数;
  • 流程解耦——发布方和订阅方在发送和接收数据时并不阻塞各自的控制流程。

从消息中间件的基本功能来看,无论是点对点消息中间件还是消息代理,其体系结构都是非常清晰简单的。但由于分布式应用及其环境的多样性和复杂性,导致了消息中间件的复杂性。

消息中间件的复杂性主要体现在下面几个方面:

  • 消息中间件需要为分布在企业各个物理服务器上的应用系统提供消息服务,而这些服务器可能采用不同硬件平台,相互之间可能通过不同的网络协议进行连接,这就要求消息中间件能够跨越不同的网络和硬件平台;
  • 分布式应用可能采用不同开发语言或工具实现,因此需要消息中间件为这些应用程序提供各类应用程序接口;
  • 由于企业网络结构的复杂性和分布式应用传输消息的多样性要求,在分布式应用之间传递的消息往往需要在消息中间件之间进行多次传输才能到达接收方,因此要求消息中间件具有存储转发或消息路由的能力;
  • 对消息传输的安全性、事务性、时限等质量要求,均需要消息中间件系统进行相应的处理;
  • 为了保证消息不会因为网络或服务器等物理故障而在传输过程中丢失,往往需要消息中间件具备消息的持久存储能力。

消息的表示 消息通常由消息头和消息体两部分组成。消息头用于描述消息发送者和接收者的地址或消息主题,以及消息的服务质量要求,例如,消息传输的时限、优先级、安全属性等;消息体用于描述消息中具体携带的信息内容。目前多采用XML作为消息表示的格式。

消息队列 为了有效控制消息收发过程而在消息中间件中内置的存储消息的数据结构。由于消息多采用先进先出的控制方式,因此,通常采用队列作为消息的存储结构。从消息的内容来看,消息可以分为发送消息队列、接收消息队列、死信队列(无法投递或过期的消息构成队列)。消息队列也可以按消息发送的质量要求进一步细分,如将优先级高的队列组织成一个优先队列,以便于处理。从队列存储介质来看,消息队列一般分为持久消息队列、内存队列和高速缓存队列。

  • 持久消息队列:基于数据库或文件系统,提供消息持久存储功能,同时又具有最小的内存开销,适合于消息需要可靠传输的应用环境。
  • 内存队列:基于内存的消息队列。不提供消息持久功能,完全基于内存来进行消息的缓存和分发。适合对性能要求非常苛刻,但是消息无需可靠持  久的应用环境。
  • 高速缓存队列:基于数据库和内存Cache的持久。提供可靠持久功能,同时又使用内存作为Cache,因此具有最大的资源开销,同时又具有很高的性能。适合于大部分应用场合。

消息路由 消息路由借用了IP层的路由和路由器中的路由的概念,但不同之处在于:消息路由属于应用层的概念。它是为了保证应用之间的消息交换处于可控的状态而设计的软件功能模块,其机制是按照消息路由规则将消息从发送者传送到目标应用,并提供消息流量控制功能。因此,消息路由有时也称为“流量控制”、“基于内容的路由”、“智能路由”。

消息QoS机制 服务质量(Quality of Service,简称QoS)是指与用户对服务满意程度相关的各种性能效果。消息QoS机制是指消息中间件提供的消息传送过程中在性能、安全、可靠性等方面的各种非功能型需求约束。消息中间件通常具有以下几种Qos特性:

  • 可靠性 消息中间件的可靠性分为消息可靠性和连接可靠性,消息可靠性控制消息失效时的处理方式,连接可靠性控制连接失败时的系统行为。
  • 事务性 为了使应用和消息中间件之间的消息传递在一个逻辑相关的序列层次上得到控制而不是仅仅只是控制单个的传递过程,消息中间件需要将这些逻辑相关的序列组成一个事务,来保证整个消息传递过程的ACID特性。
  • 安全性 提供消息的授权、认证、加密传输等手段,支持安全的消息传输。
  • 优先级 优先级用来描述消息传递的优先程度。考虑到具体的网络传输情况,消息中间件无法保证每个消息都能按时传递给接收者,所以,消息发送者通过指定消息的紧急程度,使消息按照优先级的顺序传递给消息接收者。
  • 时间约束 时间约束是指消息只在特点的时期内有效。它包括消息的开始时间、有效时间和最迟交付时间,开始时间是指消息的起始传输时间,有效时间是指消息的有效期,最迟交付时间是指消息最晚到达接收者的时间,如果消息过了这个时间仍未到达,则被废弃。
  • 队列管理 队列管理主要从消息发送的空间约束上进行控制,主要包括:队列长度、接收消息的最大数目、消息的最大长度和丢弃策略等。队列长度是内存中用来存储消息的Cache的大小,接收消息的最大数目控制消息接收者接收的消息的最大数目,丢弃策略是指当消息缓存溢出时废弃消息的顺序,常见的策略包括:FIFO、LIFO、优先级和任意顺序等。

代理化、服务化、流程化、平台化是目前消息中间件发展的主要趋势。代理化是指消息中间件体系架构逐渐向消息代理架构靠拢;服务化是指消息中间件在应用高端支持面向服务的体系架构;流程化是指消息中间件在应用形态上逐渐与业务流程管理机制相融合,成为企业应用集成中间件的一个核心组成部件;而平台化是指围绕消息处理,各种应用开发和管理工具与消息中间件有机结合在一起,为分布式应用的消息处理提供一个有机的统一平台。

参考文献

1. Eugster PT, Felber PA, Guerraoui R, Kermarrec AM. The many faces of publish/subscribe. ACM Computing Surveys, 2003,35(2): 114-131.
2. Markku Korhonen, Message Oriented Middleware (MOM): http://www.tml.tkk.fi/Opinnot/Tik-110.551/1997/mqs.htm

   青春就应该这样绽放   游戏测试:三国时期谁是你最好的兄弟!!   你不得不信的星座秘密

相关 [消息 中间件] 推荐:

消息中间件的比较-转载

- - 人月神话的BLOG
原文: http://www.orientware.org/viewArticles.do?action=browse&columnId=29&id=22&flag=home. 消息中间件(message oriented middleware)是指支持与保障分布式应用程序之间同步/异步收发消息的中间件.

[转]面向消息的中间件

- - junecauzhang的专栏
Unique integration with the database allows AQ to inherit the reliability, security, and integrity of the Oracle Database, and provides the necessary message management features for eBusinesses.

消息中间件事务处理

- - 开源软件 - ITeye博客
假设消息中间件没有提供“事务消息”功能,比如你用的是Kafka. (1)Producer端准备1张消息表,把update DB和insert message这2个操作,放在一个DB事务里面. (2)准备一个后台程序,源源不断的把消息表中的message传送给消息中间件. 允许消息重复,但消息不会丢,顺序也不会打乱.

中间件技术及双十一实践·消息中间件篇

- - 阿里中间件团队博客
消息中间件——分布式消息的广播员. 消息中间件是一种由消息传送机制或消息队列模式组成的最典型的中间件技术. 通过消息中间件,应用程序或组件之间可以进行可靠的异步通讯来降低系统之间的耦合度,从而提高整个系统的可扩展性和可用性. Notify是淘宝自主研发的一套消息服务引擎,是支撑双11最为核心的系统之一,在淘宝和支付宝的核心交易场景中都有大量使用.

消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ

- - haohtml's blog
RabbitMQ、ActiveMQ和ZeroMQ都是极好的消息中间件,但是我们在项目中该选择哪个更适合呢. 下面我会对这三个消息中间件做一个比较,看了后你们就心中有数了. RabbitMQ是AMQP协议领先的一个实现,它实现了代理(Broker)架构,意味着消息在发送到客户端之前可以在中央节点上排队.

淘宝开源分布式消息中间件Metamorphosis

- - InfoQ cn
最近,淘宝开源了分布式消息中间件 Memorphosis项目,它是Linkedin开源MQ——Kafka的Java版本,针对淘宝内部应用做了定制和优化. 据了解,Metamorphosis(以下简称Meta)的设计原则包括:. 分布式,生产者、服务器和消费者都可分布. Metamorphosis的总体 架构图如下:.

如何看待消息中间件的选型

- - 程序猿DD
近来有很多网友留言:公司要做消息中间件选型,该如何选. 我的回答一般是:It’s a nice topic~如果随意回答一个的话显得很不严谨也不太负责任,如果严谨的回答的话一天就不用干活了. 消息选型的确是一个大论题,实则说来话长的事情又如何长话短说. 被问的越多越觉得需要整理一篇自己的观点出来,主要的目的将自己的经验分享出来,可以让别人少踩点误区,次要的目的是下次再被问到了可以直接甩链接而不用再打太极(如果你后者觉得这是主要目的话,那么我只能回答:橘生淮南则为橘,嘿嘿~~).

互联网网站架构升级----消息中间件的实现方案

- liu - ITeye论坛最新讨论
    最近一直比较忙,前面设计的架构完成了基本的实现,最近工作重心发生了点转变,偷闲来继续前面的话题;.     这一篇博客准备聊聊消息系统,消息中间件对目前大中型互联网来说是非常重要的,在业务数据流动中仅次于RPC服务调用,担负着越来越复杂的网站业务从主流程上解耦的重要责任;.     从目前互联网对消息中间件的需求来看应该分为两种类型,一种是和钱相关的需求,一种是和钱无关的需求;和钱相关的需求消息的可靠性是放在第一位的,和钱无关的需求是速度放在第一位的,但这两种需求又是矛盾的,很难设计出一种既可靠又高效的系统,除非将两套方案捏合成一个系统,通过配置来选择不同方案,但从实现上说还是两种实现.

[转][转]使用 Apache MINA2 实现 Web 系统的消息中间件

- - heiyeluren的Blog
来源: http://www.ibm.com/developerworks/cn/web/1108_sumeng_mina2/index.html. 本文将介绍如何使用 Apache MINA2(以下简称 MINA2)解决复杂 Web 系统内各子系统之间同步消息中间件的问题. MINA2 为开发高性能和高可用性的网络应用程序提供了非常便利的框架.

消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局

- - 程序猿DD
有很多网友留言:公司要做消息中间件选型,该如何选. 消息选型的确是一个大论题,实则说来话长的事情又如何长话短说. 对此笔者专门撰稿一篇内功心法: 如何看待消息中间件的选型,不过这篇只表其意未表其行,为了弥补这种缺陷,笔者最近特意重新撰稿一篇,以供参考. 温馨提示:本文一万多字,建议先马(关注)后看.