认识消息中间件

原文转载http://www.uml.org.cn/j2ee/2009008071.asp

1、消息中间件是什麽 

   消息中间件是指利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。 
消息中间件可以即支持同步方式,又支持异步方式。异步中间件比同步中间件具有更强的容错性,在系 统故障时可以保证消息的正常传输。异步中间件技术又分为两类:广播方式和发布/订阅方式。由于发布/订阅方式可以指定哪种类型的用户可以接受哪种类型的消 息,更加有针对性,事实上已成为异步中间件的非正式标准。 

2、消息中间件原理 

    面向消息的中间件(MOM),提供了以松散耦合的灵活方式集成应用程序的一种机制。它们提供了基 于存储和转发的应用程序之间的异步数据发送,即应用程序彼此不直接通信,而是与作为中介的MOM通信。MOM提供了有保证的消息发送(至少是在尽可能地做 到这一点),应用程序开发人员无需了解远程过程调用(PRC)和网络/通信协议的细节。 

2.1 消息中间件简介 

    消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。 
    消息中间件适用于需要可靠的数据传送的分布式环境。采用消息中间件机制的系统中,不同的对象之间通过传递消息来激活对方的事件,完成相应的操作。发送者将 消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。消息中间件能在不同平台之间通信,它常被用来屏蔽掉各种平 台及协议之间的特性,实现应用程序之间的协同,其优点在于能够在客户和服务器之间提供同步和异步的连接,并且在任何时刻都可以将消息进行传送或者存储转 发,这也是它比远程过程调用更进一步的原因。 
如下图所示,应用程序A与应用程序B通过使用 MOM 的应用程序编程接口(API)发送消息进行通信。 
 
    MOM将消息路由给应用程B,这样消息就可以存在于完全不同的计算机上,MOM 负责处理网络通信。如果网络连接不可用,MOM会存储消息,直到连接变得可用时,再将消息转发给应用程序B。 
    灵活性的另一方面体现在,当应用程序A发送其消息时,应用程序B甚至可以不处于执行状态。MOM将保留这个消息,直到应用程序B开始执行并试着检索消息为止。这还防止了应用程序A因为等待应用程序B检索消息而出现阻塞。 这种异步通信要求应用程序的设计与现在大多数应用程序不同,不过,对于时间无关或并行处理,它可能是一个极其有用的方法。 

2.2 消息中间件与分布式对象调用的比较 

    分布式对象调用,如CORBA,RMI和DCOM,提供了一种通讯机制,透明地在异构的分布式计 算环境中传递对象请求,而这些对象可以位于本地或远程机器。它通过在对象与对象之间提供一种统一的接口,使对象之间的调用和数据共享不再关心对象的位置、 实现语言及所驻留的操作系统。这个接口就是面向对象的中间件。 
尽管面向对象的中间件是一种很强大的规范被广泛应用,但是面对大规模的复杂分布式系统,这些技术也显示出了局限性: 
1.同步通信:客户发出调用后,必须等待服务对象完成处理并返回结果后才能继续执行。 
2.客户和服务对象的生命周期紧密耦合:客户进程和服务对象进程都必须正常运行,如果由于服务对象崩溃或网络故障导致客户的请求不可达,客户会接收到异常。 
    为了解决这些问题,出现了面向消息的中间件,它较好地解决了以上的问题。 
消息中间件作为一个中间层软件,它为分布式系统中创建、发送、接收消息提供了一套可靠通用的方 法,实现了分布式系统中可靠的、高效的、实时的跨平台数据传输。消息中间件减少了开发跨平台和网络协议软件的复杂性,它屏蔽了不同操作系统和网络协议的具 体细节,面对规模和复杂度都越来越高的分布式系统,消息中间件技术显示出了它的优越性: 
1.采用异步通信模式:发送消息者可以在发送消息后进行其它的工作,不用等待接收者的回应,而接收者也不必在接到消息后立即对发送者的请求进行处理; 
2.客户和服务对象生命周期的松耦合关系:客户进程和服务对象进程不要求都正常运行,如果由于服务对象崩溃或者网络故障导致客户的请求不可达,客户不会接收到异常,消息中间件能保证消息不会丢失。 
2.3 消息中间件的传递模式 
    消息中间件一般有两种传递模型:点对点模型(PTP)和发布-订阅模型(Pub/Sub)[2]。 
2.3.1. 点对点模型(PTP) 
    点对点模型用于消息生产者和消息消费者之间点到点的通信。消息生产者将消息发动到由某个名字标识 的特定消费者。这个名字实际上对应于消息服务中的一个队列(Queue),在消息传动给消费者之前它被存储在这个队列中。队列可以是持久的,以保证在消息 服务出现故障时仍然能够传递消息。 
2.3.2. 发布-订阅模型(Pub/Sub) 
    发布-订阅模型用称为主题(topic)的内容分层结构代替了PTP模型中的惟一目的地,发送应 用程序发布自己的消息,指出消息描述的是有关分层结构中的一个主题的信息。希望接收这些消息的应用程序订阅了这个主题。订阅包含子主题的分层结构中的主题 的订阅者可以接收该主题和其子主题发表的所有消息。 
下图展示了发布和订阅模型: 


   多个应用程序可以就一个主题发布和订阅消息,而应用程序对其他人仍然是匿名的。MOM 起着代理(broker)的作用,将一个主题已发表的消息路由给该主题的所有订阅者。 

2.4 消息中间件产品与JMS 

    从上个世纪90年代初,随着不同厂商消息中间件大量上市,消息中间件技术得到了长足的发展。目 前,IBM和BEA的中间件产品在银行、证券、电信等高端行业,以及IT等行业中得到广泛应用。IBM凭借其在1999年推出的应用服务器 WebSphere,扎根金融、证券等行业,在超大型以及系统整合型应用方面优势突出;BEA则是专门从事中间件开发的公司,它的应用服务器 WebLogic在美国市场占有率超过60%,在国内电信及证券行业占据主要地位;Sun、Oracle、Sybase和Borland等厂商也都有自己 的应用服务器;近年来,以金蝶、东方通等公司为代表的国产中间件产品也发展迅速。[3] 
   由于没有统一的规范和标准,基于消息中间件的应用不可移植,不同的消息中间件也不能互操作,这大 大阻碍了消息中间件的发展。 Java Message Service(JMS, Java消息服务)是SUN及其伙伴公司提出的旨在统一各种消息中间件系统接口的规范。它定义了一套通用的接口和相关语义,提供了诸如持久、验证和事务的 消息服务,它最主要的目的是允许Java应用程序访问现有的消息中间件。JMS规范没有指定在消息节点间所使用的通讯底层协议,来保证应用开发人员不用与 其细节打交道,一个特定的JMS实现可能提供基于TCP/IP、HTTP、UDP或者其它的协议。 
   目前许多厂商采用并实现了JMS API,现在,JMS产品能够为企业提供一套完整的消息传递功能,下面是一些比较流行的JMS商业软件和开源产品。 
1.IBM MQSeries 
        IBM MQ系列产品提供的服务使得应用程序可以使用消息队列进行相互交流,通过一系列基于Java的API,提供了MQSeries在Java中应用开发的方 法。它支持点到点和发布/订阅两种消息模式,在基本消息服务的基础上增加了结构化消息类,通过工作单元提供数据整合等内容。 
2.WebLogic 
        WebLogic是BEA公司实现的基于工业标准的J2EE应用服务器,支持大多数企业级JavaAPI,它完全兼容JMS规范,支持点到点和发布/订阅消息模式,它具有以下一些特点: 
1) 通过使用管理控制台设置JMS配置信息; 
2) 支持消息的多点广播; 
3) 支持持久消息存储的文件和数据库; 
4) 支持XML消息,动态创建持久队列和主题。 
3.SonicMQ 
       SonicMQ是Progress公司实现的JMS产品。除了提供基本的消息驱动服务之外,SonicMQ也提供了很多额外的企业级应用开发工具包,它具有以下一些基本特征: 
1) 提供JMS规范的完全实现,支持点到点消息模式和发布/订阅消息模式; 
2) 支持层次安全管理; 
3) 确保消息在Internet上的持久发送; 
4) 动态路由构架(DRA)使企业能够通过单个消息服务器动态的交换消息; 
5) 支持消息服务器的集群。 
4.Active MQ 
       Active MQ是一个基于Apcache 2.0 licenced发布,开放源码的JMS产品。其特点为: 
1) 提供点到点消息模式和发布/订阅消息模式; 
2) 支持JBoss、Geronimo等开源应用服务器,支持Spring框架的消息驱动; 
3) 新增了一个P2P传输层,可以用于创建可靠的P2P JMS网络连接; 
4) 拥有消息持久化、事务、集群支持等JMS基础设施服务。 
5.OpenJMS 
       OpenJMS是一个开源的JMS规范的实现,它包含以下几个特征: 
1) 它支持点到点模型和发布/订阅模型; 
2) 支持同步与异步消息发送; 
3) 可视化管理界面,支持Applet; 
4) 能够与Jakarta Tomcat这样的Servlet容器结合; 
5) 支持RMI、TCP、HTTP与SSL协议。