用中间件构造DTP应用


(来源:http://www.tongtech.com)

  DTP,即分布式交易处理(Distributed Transaction Process),主要表现为一些有实时性需求的应用,如银行、证券、电信、航空、交通、海关等业务处理系统。

  目前的DTP应用多数是客户/服务器结构的,由客户端处理数据的输入输出和基本预处理,服务端进行具体的数据处理。客户/服务器结构,有利于充分利用主机的处理能力,客户机有自己独立的处理能力,既分担整个系统的部分处理工作,也可以充分满足各种用户对操作界面的不同需求。

  一个DTP应用必须处理好两个关键问题:客户方与服务方的通讯效率;客户方与服务方的交易完整性管理。这两个关键问题处理得是否合理,将决定一个DTP应用的成功与否。

  在以往中间件没有被充分重视的时候,一个DTP应用通常采用两种方式来实现:

  • 开发一个通讯程序来连接客户方和服务方,由应用程序自己解决交易完整性问题。
  • >
  • 直接使用数据库的连接工具,同时采用数据库的交易处理机制来管理交易的完整性。
  实践证明,这两种方式在一个大规模系统中都存在着由于先天不足所产生的不适应性,不能很好的解决效率和交易完整性管理这样两个关键问题。解决问题的必由之路,是遵照X/Open DTP模型的分层结构思想进行设计,在一个DTP应用中架构中间件。

  本文介绍了用消息中间件TongLINK和交易中间件TongEASY开发一个DTP应用的方法,同时在比较的基础上,概要介绍用TongLINK和TongEASY移植改造上述两种DTP应用的基本思路。

1、用TongEASY开发DTP应用
  用TongEASY开发DTP应用,有两种实现方式:一种是TongEASY建议方式,另一种是基于标准的XA接口方式。

  做这样的区分,主要为了适应不同的网络环境。XA接口在不可靠的低速网上,因为握手次数多、数据库加锁时间长,因而效率较低,同时不能很好地解决由于网络故障所造成的交易完整性问题。

  用TongEASY建议方式开发的DTP应用,由TongEASY监控所有交易,发现异常交易时,重复核对,根据核对结果确定本笔交易提交、回滚或者冲正。这样,正常交易握手次数少,效率高,异常交易重复核对,可以很好的解决网络故障造成的交易完整性问题。

1.1TongEASY建议方式

  使用TongLINK和TongEASY的DTP应用的基本运行模式:

  • 系统初始运行时,客户机与服务器建立连接;
  • 客户机上进行数据输入/输出处理,申明交易开始,向服务器申请服务,最后向服务器提交交易或撤消交易;
  • 服务器上交易管理程序接收客户机的服务请求和提交/撤消交易的结果。如果是交易请求,则根据请求服务类型调用相应的服务程序进行逻辑处理,如果是提交/撤消交易的结果,则同样送相应服务程序进行处理。
  应用程序的处理过程:
  • 在收到服务请求时进行正常逻辑处理,并锁定相应数据记录;
  • 在收到提交结果时对锁定记录解锁;
  • 在收到撤消结果时进行撤消逻辑处理。
  交易结果如果以客户机为准,则客户方提交或撤消交易信号发出时即认为成功。如果服务器未收到交易结果时,将主动与客户机上的交易管理模块进行核对以获取交易结果,保证服务器的处理结果与客户机一致。

  TongEASY的建议方式即使在受到网络或其它干扰时,仍能保证数据的一致性。采用这种方式对应用程序的要求较高,相对使用XA接口需要较多的编程代码。

  TongEASY V2.0 要求开发人员自行确定交易类型与服务方处理程序之间的对应关系,以6位数字的交易码标识,并编制完整的程序代码。

  TongEASY V2.5 则提供了一个更为易用的开发环境:应用开发只需确定交易码与服务方处理函数的对应关系,并编制函数内部的处理代码,主程序则由TongEASY提供统一的模板,应用系统结构因此更趋简单明晰。

1.2 基于XA的开发方式

  TongEASY使用XA接口构造的应用系统,其基本运行模式为:
  • 客户机上进行数据输入/输出处理,与服务器连接,申明交易开始,向服务器申请服务,最后向服务器提交交易或撤消交易,并等待服务器处理结果。
  • 服务器上的TongEASY接收客户机的服务请求,根据请求服务类型调用相应的服务函数进行逻辑处理,并将处理结果返回客户程序。
  • 采用XA接口构造应用系统的好处在于应用编程比较简单,但在低速且不十分可靠的广域网上,其运行效率较低,在网络受到干扰的情况下,采用两阶段提交协议可能导致交易结果不一致。所以,用XA接口构造应用系统的前提条件是网络必须高速可靠。

2.改造已有的通讯程序

  用一个通讯程序来解决客户端和服务端的连接问题,是国内开发DTP应用的一种常用方式,它简化了客户/服务器结构所派生的通讯复杂性,能够快速构造出一个客户/服务器结构的应用系统。问题的关键是通讯程序应该如何实现。

  在已经开发完成的一些应用系统中,通常是把一个通讯程序简单的实现为请求连接方式,即前端有请求时与服务器进行连接,并且向中心传递服务请求和数据;服务器上有一个守护程序监听服务请求,当有服务请求到达时,根据不同的服务请求启动相应的服务程序进行服务。

  请求连接方式的优点在于简单,通讯程序与应用程序基本合为一体。但正是由于简单,请求连接方式存在着明显的不足,最大的问题是对大规模并发请求的适应能力。

  在请求连接方式下,对每一笔交易,客户端都需要与服务端建立一次连接,交易结束再拆除连接。建立连接和启动服务程序都将占用系统的大量时间,所以整个系统的效率不高。当系统规模增大,请求增多时,服务器上需要建立大量的连接,服务进程也将随着请求增加而不断增加,对服务器系统资源要求巨大,当进程数超过系统限制时将导致整个系统的崩溃,所以这种请求连接方式不适用于大规模系统。

  对应于请求连接方式的不足,消息中间件TongLINK的实现机制有其先进之处:

  • 每一个客户节点与服务器建立一个常连接;
  • 客户端能正确识别交易与客户进程的对应关系,即应答能正确送回请求进程;
  • 服务端提供对服务进程进行调度管理的功能。
  TongLINK能够最大程度的解决应用对通讯的多方面的要求,完成一个简单的通讯程序所不能负担的工作。解决请求连接方式存在的问题,最彻底的办法是用TongLINK去替代原有的通讯程序,实现应用间的通讯。

  使用TongLINK解决的是客户端与服务端的连接问题,在一个DTP应用中,还需要考虑交易完整性的问题,尤其在一笔交易需要跨越多个节点的多台机器时。所以,在一个DTP应用中,应该同时用交易中间件来完成数据一致性控制,这也符合X/Open DTP模型的定义。

  有通讯程序的DTP应用,一般已经采用交易一次交互方式。客户端向中心申请服务并等待应答,中心有一守护程序,接收前端请求启动相应服务程序并返回处理结果。移植这样的DTP应用比较简单,保持原通讯函数接口不变,编写一同名函数调用TongLINK和TongEASY接口函数进行数据收发即可,同时用TongLINK和TongEASY替换原通讯程序。以银行的业务处理系统为例,修改内容包括:
  • 在原请求和应答基础上增加确认过程,记帐交易结果以客户端处理结果为准,冲正交易结果以服务端为准;
  • 客户程序在记客户端流水后,向中心发送处理结果;
  • 服务程序改造成可循环处理,减少启动次数;
  • 服务程序在记帐后对帐户设置锁标志,在未收到确认/冲正前,该帐户不能被修改;
  • 服务程序增加确认处理和自动冲正处理。冲正分两类:操作员发出的冲正请求为人工冲正,交易过程中发现错误进行冲正处理为自动冲正。

3.改造数据库方式的DTP应用

  数据库连接工具是为了简化应用开发的复杂性,同时利用数据库的交易机制来保证数据的一致性。

  在客户机/服务器结构方面,数据库与应用系统有明显的区别。数据库的客户/服务器结构,其含义是将应用程序称之为客户方,而数据库核心对数据的处理称为服务方,数据库的客户/服务器结构往往表现为,应用程序在一台机器上,而数据库的核心处理在另一台机器上。

  使用数据库连接工具,在通讯线路可靠,传输速率高于38400bps时,是一种简便的方式。但在线路条件一般的情况下,用这种方式开发的应用程序在使用效率上和交易可靠性上都存在着不足。

3.1 改造数据库的透明存取方式

  数据库透明存取方式下,所有应用程序均在客户机上运行,数据存放在服务器上。数据库数据透明存取方式的优点在于编程方式简单,与单机编程方式基本一致。

  数据库透明存取方式主要有以下不足之处:

  • 一次交易需要多次数据库操作,也就是说,需要多次在网络上通过SQL语句传递数据。而传递SQL语句,在速率不高的广域网上运行效率极低。
  • 在不是非常稳定可靠的广域网上,客户机向服务器发出交易提交或取消命令,提交/取消命令可能在传输过程中丢失而导致交易的不完整性。
  所有处理逻辑均在客户机上,仅有数据存取在服务器上进行,对客户机要求较高。

  用TongLINK和TongEASY移植这一类程序的基本过程:

  • 重新整理交易流程,将一笔交易处理过程分解为前端数据录入和预处理,中心业务逻辑处理,以及结果输出处理;
  • 确定前端与中心之间交换数据内容;
  • 构造运行环境,配置运行参数。

3.2 改造数据库的存储过程方式

  数据库采用存储过程来解决效率问题。

  存储过程是利用数据库提供的工具编写一组SQL语句,编译后存放在数据库中,完成交易的逻辑处理工作。客户机上进行数据输入/输出处理,逻辑处理通过调用服务器上的存储过程来实现,客户机调用存储过程如同调用一个函数一样。

  这种方式减少了客户机存取数据库的交互次数,相对于数据透明存取有较高的运行效率,但相对于消息中间件来说,网络速率越低,存储过程的运行速度越慢。

  当存储过程运行结束,所有数据库操作也就完成了,但问题是传送的应答数据可能丢失,导致客户机失败,而服务器成功,使数据的一致性得不到保证。另外,当存储过程处理结果返回到客户机上,而操作员决定取消该交易时,需通过调用另一存储过程来取消上一笔交易的结果,应用程序的编写量增大。

  用TongLINK和TongEASY移植这一类程序将比较方便,只需将存储过程改造成服务程序,将前端程序调用存储过程的功能改造为调用服务程序的语句。

  从实际应用结果来看,在低速网上TongLINK和TongEASY的运行效率明显高于存储过程。而且,TongLINK和TongEASY有助于了解应用系统的各方面运行状况,包括节点的连接情况、交易处理情况、程序运行情况等,方便系统的管理,应用程序的开发也具有很大的灵活性。