上一篇文章我们介绍了中间件的由来、定义和作用,这篇文章我们继续中间件的学习,中间件的产品种类很多,根据中间件在系统中所起的作用和采用的技术不同,我们将中间件进行了分类,我们今天就详细学习下中间件具体知识。
分类
中间件分为远程过程调用中间件、数据访问中间件、消息中间件、事务(交易)处理中间件、分布式对象中间件。
远程过程调用中间件(RPC, Remote Procedure Call)
我们一个一个来学习,首先来学习的是远程过程调用中间件,远程过程调用就是程序和程序之间的通信,就是客户端应用程序调用位于远端服务器上的过程,它的基本思想是保持客户端(调用者)和服务器(被调用的)程序的语法一样,好像它们是在同一台机器上.程序员就像调用本地过程一样在程序中调用远程过程,启动远程过程的运行,然后将运行结果返回给本地程序。远程过程调用就这么简单,具体调用过程如下图:
在具体介绍远程调用过程前,先介绍两个概念分别是Stub(存根)和Skeleton(骨架)。
Stub用于客户端,主要作用是
1、建立客户与服务器之间的连接
2、将客户的高层调用语句打包为一条底层的请求消息,这一过程在RPC中被称为列集(marshalling)
3、等待服务器返回应答消息
4、将来自服务器底层的应答消息解析为可以返回的数据,这一过程在RPC中被称为解列(unmarshalling)
5、将返回值传送给客户程序
在此过程中需要注意的是,编码、字节序 等问题
skeleton用于服务器端,作用跟stub作用查不多,先解列然后在列集,不过skeleton除了需要进行列集、解列外,还需要区分客户所请求的过程名,然后将客户的请求分派(dispatch)给正确的过程。
下面我们来看下RPC具体工作过程是:
1、客户按本地调用的方式,直接调用本地的客户占位程序/指代/代理(Stub), Stub具有与服务器相同的过程接口
2、Stub将客户的调用请求进行加工、打包,向底层通信机制(如套接字)发出请求消息;Stub不进行任何逻辑处理,只是一个中介
3、客户端通过底层的通信机制,将消息传送给服务器端的底层通信机制
4、服务器需要部分地解析消息,找出客户希望调用的服务器程序
5、服务器构架(Skeleton)对消息进行解析,从中获得调用者的参数,然后调用服务器程序
6、服务器程序执行相应的过程
7、服务器程序将结果返回给Skeleton
8、Skeleton将结果打包,向底层通信机制发出应答消息
9、服务器端通信机制将消息传送给客户端通信机制
10、客户端节点上也可能有多个调出点,通信机制需要部分地解析返回的消息,找出消息应该返回给哪个客户程序,并将消息发送给对应的Stub
11、Stub从消息中解析结果,返回给客户程序
远程调用的实现一共有两种,分别是SUN的RPC和微软的RPC,
SUN RPC(Solaris上实现)
DCE(DistributedComputing Environment) RPC(UNIX,Windows)
远程调用拥有灵活性,体现在它的跨平台性上面,它不仅可以调用远端的子程序,而且这种调用是可以跨不同操作系统平台的,而程序员在编程时并不需要考虑这些细节。
RPC也有一些缺点,主要是因为RPC一般用于应用程序之间的通信,而且采用的是同步通信方式,因此对于比较小型的简单应用还是比较适合的,因为这些应用通常不要求异步通信方式。但是对于一些大型的应用,这种方式就不是很适合了,因为此时程序员需要考虑网络或者系统故障,处理并发操作、缓冲、流量控制以及进程同步等一系列复杂问题。
数据访问中间件(DM,Database Middleware)
在所有的中间件中是应用最广泛,技术最成熟的一种。它是连接应用程序和数据库的软件,允许通过单一的、定义良好的接口访问网络中来自不同厂商的数据库产品,是为了建立数据应用资源互操作的模式,对异构环境下的数据库实现联接或文件系统实现联接的中间件;
数据访问中间件在数据库管理系统的基础上,对异构环境下的数据库实现联接或文件系统实现联接的中间件,为应用程序访问数据库提供开发支撑。
数据访问中间件是程序与数据库之间的通信,从客户端读取或者写入一个数据库的能力,该数据库在物理上位于一台不同的机器上,并且这些数据库也可以是不同的数据库产品;
一个最典型的例子就是ODBC,ODBC是一种基于数据库的中间件标准,它允许应用程序和本地或者异地的数据库进行通信,并提供了一系列的应用程序接口API,当然,在多数情况下这些API都是隐藏在开发工具中,不被程序员直接使用。有过实际编程经验的朋友都知道,在写数据库程序的时候,只要在ODBC中添加一个数据源,然后就可以直接在自己的应用程序中使用这个数据源,而不用关系目标数据库的实现原理、实现机制,甚至不必了解ODBC向应用程序提供了哪些应用程序接口API。
不过在数据库中间件处理模型中,数据库是信息存贮的核心单元,中间件完成通信的功能,这种方式虽然是灵活的,但是并不适合于一些要求高性能处理的场合,因为它需要大量的数据通信,而且当网络发生故障时,系统将不能正常工作。所谓有得必有失,就是这个道理,系统的灵活性提高是以处理性能的降低为代价的。
消息中间件(MOM,Message Oriented Middleware)
由于RPC是同步调用的,不可以进行异步调用,消息中间件在应用间通过传递消息来进行协作,是一种异步通信模式,所以它的动机就是RPC调用的缺点。
消息中间件为应用程序提供发送和接收异步消息支持的中间件。基于消息的交互方式提供了基本的异步编程模式,即客户端可以通过发送消息来请求某种服务,在服务端处理请求期间,客户端不必等待对方完成,可以执行其它操作,服务端完成后会以消息的形式通知客户端。在消息中间件的支持下,应用程序可以很容易地实现消息的发送和接收,而不必关心消息交换过程中的具体细节。
主要功能是在不同的网络协议、不同的操作系统和不同的应用程序之间提供可靠的和可恢复的(若发生意外)消息传送。这时应用并不需要消息即时即刻传递到达对方。就是客户端将消息放入队列,服务器端在方便的时候取出处理,如果需要,将结果放到传送给客户端的队列。
消息中间件工作原理是:
1.应用之间以一系列消息的方式进行通信。
2.在消息传递过程中,为了避免消息被丢失,消息被保存在消息队列中。
3.应用把消息发送到与接收者有关的队列中。消息传递机制保证将消息传送到目的地且只传送一次。
4.在消息传递过程中,应用之间不必建立联系,发送者仅需将消息放入到与接收者有关的队列中,而不必关心接收者是否在线。
5.接收者仅需从自己的队列中提取消息即可。
消息中间件的优点在于能够在客户和服务器之间提供同步和异步的连接,并且在任何时刻都可以将消息进行传送或者存储转发,这也是它比远程过程调用更进一步的原因。另外消息中间件不会占用大量的网络带宽,可以跟踪事务,并且通过将事务存储到磁盘上实现网络故障时系统的恢复。当然和远程过程调用相比,消息中间件不支持程序控制的传递,不过这种功能和它的优势比起来却是无关紧要的。
消息中间件可适用于需要在多个进程之间进行可靠的数据传送的分布式环境。
消息中间件可用来屏蔽掉各种平台及协议之间的特性,进行相互通信,实现应用程序之间的协同
消息中间件使分布式处理可以在脱机、事件驱动等的方式下运行,适合与电子商务、移动用户、工作流或其它的环境中。
由于消息中间件是异步的,所以不适合实时的处理。
事务(交易)处理中间件(Transaction
Processing Middleware,TPM)
事务(交易)处理中间件是在分布、异构环境下提供保证交易完整性和数据完整性的一种环境平台。
事务(交易)处理中间件是提供事务控制机制的中间件,专门针对联机交易处理系统而设计。联机交易处理系统一般都需要处理大量的分布式事务。分布式事务一般都会涉及到多个数据库,且允许这些数据库异构,如在不同的银行间进行资金转账。所以分布式事务需要处理大量并发进程,涉及到操作系统、文件系统、编程语言、数据通讯、数据库系统、系统管理及应用软件,是一个相当艰巨的任务.这种情况下通过事务处理中间件简化应用开发。由它来负责处理联机交易过程中分布式交易的完整性、并发控制、负载均衡以及出错恢复等。可把自己的事务管理功能和数据库已有的事务管理能力有机结合在一起,实现对分布式事务处理的全局管理。
一般来说事务(交易)处理中间件给程序员提供了一个事务处理的API,程序员可以使用这个程序接口编写高速而且可靠的分布式应用程序。
分布式事务涉及到多个结点的数据的更新,任何一个结点或结点间通信的失效都可能导致分布式事务的失败。因此,为了保证事务的完整性,分布式事务通常采用两阶段提交协议(TwoPhase Commitment Protocol,简称2PC)来提交。
阶段1(准备阶段)
TM询问所有的RM是否已准备提交。
阶段2(提交阶段)
TM检查所有RM的回答,只要有一个RM给出否定的回答,TM指示所有的RM进行回滚。否则, TM指示所有的RM进行提交
在两阶段提交中,一个主节点被指派为事务协调者(Coordiantor),其他节点称为事务参与者(Participants)。协调者掌握提交或撤消事务的决定权,而其它参与者则各自负责本地数据的更新,并向协调者提出撤消或提交子事务的意向。一般一个结点对应一个子事务。
分布式对象中间件
分布式对象中间件是调用位于另一个系统上的对象,提供构件化支持的中间件。在分布、异构的网络计算环境中将各种分布对象有机地结合在一起,完成系统的快速集成,实现对象重用。有了各种中间件的支撑,在应用软件中用到中间件对应的功能时,不需要开发人员自己实现,可直接利用中间件将其已实现好的功能快速集成到应用软件中。
后记
关于中间件的知识这篇文章就介绍到这里,下篇文章我们继续中间件的知识。