
| 出版日期:1999-08-09 总期号:847 本年期号:57 |
|
用mts快速构建oltp应用
mts(microsoft transaction server)是一个面向构件的对象交易中间件(otm,object transaction middleware)。不仅为构建基于构件的多层式面向交易的分布式应用提供了一个强有力的支撑框架,同时也是oltp(online transaction processing)应用的交易监控器。如何使用mts进行多层式oltp应用开发?本文将给您一个详细的答案。 mts是什么 基于对象构件和多层结构的oltp(联机交易处理)系统开始变得流行起来了。主要的原因有:二层模式中,由于客户机直接连至dbms,随着联机客户机以及交易规模的增大,系统的可扩展能力以及可管理和维护能力都受到越来越大的限制。其次,由于业务模式逐步转向以电子商务为代表的internet/intranet环境,基于浏览器的瘦客户机成为主要的操作界面,现有的两层式结构难于适应这样的转变。多层式结构通过应用功能的分区来增强可伸缩性、可复用性、安全性和可管理性:表示逻辑(presentation logic)实现用户操作界面,运行在台式客户机或浏览器上;应用逻辑(application logic)位于中间层的服务器上,实现各种业务逻辑,接受和响应客户机的应用请求;而数据和资源(data and sources)则置于专用的服务器上(如rbms),接受和响应中间层数据服务请求。 然而,多层分布式的应用开发面临着新的技术挑战:如何提供一个强有力的底层支撑框架(framework)来处理分布式处理的各种复杂需求,使得开发任务能够从这些底层服务的实现中解脱出来,真正集中在具体的业务功能和数据服务的实现上来。 其实,一些供应商的面向交易处理的中间件(middleware)产品已经扮演这样的角色:在中间层提供一个运行平台来支撑开发并运行业务逻辑及数据访问、提供交易监控器(tp monitor)以定义、执行、管理和监控各种分布式交易。如ncr topend、bea texudo等。 同样,微软提供给windows/windowsnt用户的解决方案——microsoft transaction server(mts)——是一个全新的面向构件的对象交易中间件(otm)。作为微软分布式计算框架com+(原com/dcom)的一重要部分,mts不仅为构建基于对象构件的多层式面向交易的分布式应用提供了一个强有力的支撑框架,同时也是oltp应用的交易监控器。mts能够提供良好交易处理性能及伸缩性、负载均衡、灵活的开发工具及快捷构件式编程支持、集成灵活的安全控制以及集中式管理工具。图1所示是mts的功能逻辑。下面就如何使用mts 2.0进行应用开发展开详细的讨论。 用mts实现业务逻辑 对于mts来讲,一个应用构件就是一个in-process activex构件,即由dll构成,在mts运行环境中执行。由于是com对象,所以任何支持com编程的开发工具都可以创建这样的dll,如visual basic、visual c++、visual j++和delphi等。microsoft通常又称这样的对象为activex构件,mts executive(mtx)是这些构件的容器(container),一组运行在同一进程空间中的构件构成包(package)。 虽然mts构件编程需遵循com编程模式,但与传统com编程存在一定的不同:在线程服务、交易服务、安全服务、数据服务以及性能等方面都需要更多的考虑。 编译时注意将类型库(tlb)和proxy-stub dll与实现的构件dll 分开。这样客户机应用只需安装类型库或定制的proxy-stub dll即可实现对mts构件的远程访问。 用mts开发业务逻辑构件非常简单,这是mts的最大的优势。图2所示是mts构件程序的模板(用visual basic 5.0实现,下同)。为了使构件在mts运行环境中高效的工作,开发时注意下述几点规则: * 构件必须创建一个交易上下文对象(icontextobject)的引用,通过该引用即可获得mts交易控制、连接管理、线程化、监控和安全等方面的服务。 * 不要在构件中保存任何状态信息(如在局部或全局变量中),因为构件执行完后mts无法回收这些资源。所以这样的信息需要保存在数据库中或spm(详见下文)中,需要时通过构件访问即可。 * 如需内部存取其他构件,必须先用上下文对象引用的createinstance方法创建构件的对象。该实例将继承现有的上下文对象的引用以及交易属性。不要使用new操作符或createobject,因为这样将导致该对象将在另外的分离的线程上运行,从而增加了负载,影响了性能。 * 当构件成功执行完成后,必须通过上下文对象的实例调用setcomplete方法,通知mts交易完成,可以提交所完成的所有工作并回收被构件占用的资源。 * 当构件成功执行失败后,必须通过上下文对象的实例调用setabort方法,通知mts夭折。当前交易取消所有的改变,同时回收被构件占用的资源。 如何保证这些构件在大量客户机并发访问时既具有良好的性能又保持良好的伸缩性?mts提供了自动对象实例管理功能:及时激活(just-in-time activation)和尽快去活(as-soon-as-possible deactivation)。一旦对象被客户机或其他对象引用,mts激活该对象。当对象通知mts已完成处理、对象的交易已完成、或对象最后的引用被释放时mts尽快使对象去活,释放对象的大部分资源占用(仍保留小部分资源以加快激活)以节省系统资源的开销。一旦对象被去活,马上就可以被其他客户机复用。甚至允许对象已被去活,但控制中的客户机仍保持该对象的一个有效引用。如果客户机调用该已释放对象的一个方法,该引用将被自动绑定到一个新的对象上,从而可以完全透明地继续使用该引用。 为了减少服务器负载,mts通过自动线程池机制来保证每个构件对象以一个单独的线程来执行。mts在线程池中预先分配对象线程。客户机访问对象时,mts从线程池中自动定位一线程,在该线程上执行该构件,执行完后将线程还回池中。这样可简化构件的编程,缩短了线程的建立和释放的开销来达到改善性能和获得更大伸缩性的目的。所以,在实现时,构件至少要采用sta(single-threaded apartment)模式,绝对不能是单线程(single-threaded)的,因为单线程的构件将严重影响其伸缩能力。建议采用mta(multi-threaded apartment),可保证构件具有更大的并发处理能力,而且使线程安全的、可重入的。vc++ 5和vj++ 5都支持mta构件的创建。而vb 5.0和6.0仅仅支持sta构件的生成。
图1 mts功能逻辑
图2 mts构件程序的模板 mts提供了共享特性管理器(shared property manager,spm),它是一种资源分送器,用以在同一服务器进程中多个对象共享的状态信息的一致访问。为了解决并发性和命名冲突,spm 使用isharedpropertygroupmanager接口创建和管理共享特性组。isharedpropertygroup接口用于在一共享特性组中建立或访问共享特性,而isharedproperty 接口用于存取共享特性值。 再则,spm 通过锁和信号量机制保护共享特性并发访问的一致性。因而,无须复杂编程即可实现共享数据的安全访问。 用mts提供数据资源的存取 mts可支持的数据资源由资源管理器(resource manager,指可交易的数据管理服务,如dbms、文件管理系统、消息队列管理系统等)提供并永久存放。mts不能为其activex构件的数据访问提供自由的机制,因为数据访问必须满足分布式交易协议以及mts对其可伸缩性的要求。microsoft推荐的方法是采用odbc api。另一方法是采用数据库固有的api,如oracle objects for ole(oo4o)2.2,已经考虑了对mts的支持,可以使用。另外,两种新的基于com编程、数据库独立的api:microsoft ole db和ado(active x data object)也可用于mts管理的activex构件中实现更广泛的数据存取。 无论采用哪种接口,建立和关闭数据库连接总是耗时的,而且从伸缩性方面考虑,两层式结构中一对一数据库永久连接的做法是不允许的。为了达到能创建高效、可伸缩的应用目的,mts提供一种快速数据库访问机制——资源分送器(resource dispenser)以缓存各种资源(如odbc数据库连接),并使得各应用构件可以共享地复用这些资源,无需再建立新的。mts 2.0版本中提供odbc 3.0 driver manager作为数据库连接的资源分送器,自动创建并管理可复用的odbc数据库连接池。当应用构件执行标准odbc调用时,mts定位于一可用的连接并使用,在调用完成后将连接交还给连接池。为了odbc兼容的数据库能支持mts交易,数据库的odbc驱动程序必须是thread-safe的,同时须支持sql_attr_enlist_in_dtc连接属性。此外,由于微软公开了资源分送器的技术规范及其sdk,相信不远的将来,我们能得到从微软、数据库供应商或第三厂商得到更多的资源分送器以实现对更多资源的高效访问。 在编写构件代码以访问数据时,应尽量晚地获取数据库连接,将数据存取的工作尽可能地集中处理,并尽可能快地释放这些连接。这样才能最大限度地节省服务器资源。 客户机访问mts构件 客户机可以通过三种方式访问mts构件:windows 9x和windows nt 4.0客户机可以由dcom访问;而windows 3.x或windows nt 3.x老式前端不支持dcom的,可通过remote automation访问,但mts服务器需要另外安装remote automation connection manager(racman);对于采用浏览器的客户机则需访问microsoft internet information server(iis)经由activex server page以dcom方式远程调用mts构件。 虽然mts应用无需特别的运行库或服务在客户机上运行,但一些registry项则需要配置以通知dcom或remote automation在哪儿可以找到mts对象的事例。mts提供的automatic client installation utility可以在客户机上自动完成所需配置,包括注册clsid并安装类型库(tlb),从而使得客户机应用可以透明地远程访问mts构件。 下面的代码片段演示了客户机如何访问mts构件。没有代码指定交易的起止,只需简单地调用mts对象的方法交由mts自动支持交易。 dim objfoo as component1.foo set objfoo = createobject ("component1.foo") objfoo.mothod1 (…) set objfoo = nothing 用mts管理交易 一个mts交易可以存取一个或多个资源管理器的数据。当交易结束,调用setcomplete或setabort时,通过分布式交易协调器(dtc)执行两阶段提交(two-phase commit)来完成交易控制。为了实现与资源管理器的交互,dtc采用ole transactions规范,任何采用该接口的资源管理器(如sql server 6.5)可以直接与dtc交互。对于支持x/open xa接口规范的资源管理器(如大多数unix数据库如oracle、db2等),则可透过ole transactions-to-xa mapper处理来自mts的ole transaction并将之翻译成xa规格,从而实现与xa数据源的交易控制。 在构件与交易结合时,传统的由客户机控制的方式不是最好的方法。mts引进了新的机制——automatic transactions——来界定mts交易的范围,并无需客户机清楚交易的起止,也就是说客户机不再明确地用编码来指定开始交易或结束交易。这种交易管理逻辑并不是一定要在应用逻辑中定义的。相反,构件的交易属性值可以在其被装配成应用包时明确指定为:required、supported、not supported或requires new。当客户机应用请求创建一个新构件的实例,mts检查调用者的交易状态以及新构件的交易要求。不管什么情况,mts总是要求做过的每件事完成提交或撤消,但调用setcomplete并不意味着交易马上提交。如果构件作为一个完整的交易实现了所有的处理,mts将真正地进行提交。倘若构件仅作为一个完整交易的部分被调用时,虽然在完成时setcomplete仍被调用,但实际的提交工作直到该交易中所有参与的构件的setcomplete完成后才进行。所以这些构件代码看上去相同,不同的使用将是不同的表现。 采用这种声明式的交易语义使得一个构件既可以作为一个交易单独执行,也可是一组构件组合成一个交易的一部分。这种灵活的方式使得设计者无需重写交易控制逻辑,只需将应用构件化并定义好交易关系即可复用应用代码。而且可以透明地将第三方的业务构件产品结合到自己独立开发的构件中来。 如同许多nt server管理工具,mts explorer为一个或多个mts服务器提供集中式的管理功能。dtc管理方面可提供交易列表、交易管理和跟踪信息。此外,可以在构件级监控mts应用的运行情况,包括构件的当前活动情况、当前已分配的对象实例数、当前被客户机使用的对象数目、当前被客户机激活的对象数目等等。另一方面,mts explorer本身也是一个com automation server,可编程的,允许编程实现定制的管理、统计、监控或错误检测等管理功能。 |
|||||||||||||||||