实现健壮性能的规则
Hank Marquis
来自于Enterprise Solutions for Microsoft BackOffice and Windows NT Magazine
原稿地址:http://www.microsoft.com/china/technet/intranet/sevstep.asp
在你的服务器上安装了微软IIS(Internet Information Server),你就可以发挥ASP(Active Server Pages)的优势了,ASP利用ActiveX组件来为你的网络应用完成所有种类的工作。尽管你可以在HTML和有ASP页面的IIS里面使用许多ActiveX组件,服务器端组件也不是运行在一台服务器上的普通组件。它在运行时不会告诉你同需要特别关照的产品服务器有关的任何信息。你将无法做任何事情去改变其对服务器性能、安全和稳定性的影响。对服务器端的组件的不恰当选择可能会导致一些问题,包括速度的明显下降,安全漏洞或者其它更恶劣的问题。
客户端的组件在用户计算机上执行。客户端组件包括绝大多数我们现在已经了解的一些流行组件:标签控件,文本框,命令按钮,格子等。这些组件可以通过<OBJECT>标签和(或)HTML对象语法来包含在客户端HTML代码中。
多数的有用的客户端组件会提供特定种类的用户界面。记住,使用客户端组件就意味着真实组件已经被传到客户计算机上。寻常的做法就是把组件下载到客户计算机上。当然,用户不得不等待下载过程,而且客户计算机必须被配置为允许下载。
与此形成对比的是,服务器端的组件在服务器计算机上执行。服务器端组件也为用户做一些工作,但却是在服务器上运行的。你必须认识到这个差异并且相应地编制代码。服务器端组件为你的整个应用程序封装了一些逻辑或功能。
当一个用户使用应用程序时,他将不会真正看到服务器端的组件。这些组件大多数都可以通过需要使用组件的ASP脚本中的<OBJECT>标识来被包含。你同样可以通过服务器的CreateObject语法来包含服务器端的组件。
建造健壮的组件
用于创建健壮组件的好材料并不多。但是,我在这里向大家推荐七个关键步骤,它可以帮助你创建稳定和安全的服务器端组件,可以很优雅地缩放并且维持性能。在创建一个服务器端网络应用时,你需要把稳定,安全和性能放在你心目中的首要位置。
服务器端组件不应该具有GUI(图形用户界面)。因为服务器端组件是在服务器上运行,网络应用的用户是看不到可能弹出的任何对话的。你的组件需要能够同脚本和其它组件进行交流,却无需同用户交流。避免所有的消息框和其它任何图形的用户界面单元。你必须开发利用返回结果来同状态和其它模块信息进行交流的代码。如果什么东西出问题,不要抛出一个错误消息或者使用一个消息框,可以返回一个状态变量。你需要做的最后一件事是锁定忙碌服务器等待OK按钮被按下。
服务器端组件不得被传递引用或者传递引用给对象。普遍的做法是把控制作为一个参数传递给其它过程或组件。这包括其它对象的引用,比如RecordSets。尽管如此,向网络中的组件传递引用可能导致速度明显下降,使一个繁忙的服务器更加缓慢,网络应用程序在响应用户需求时也表现得更慢。
服务器端组件应该尽可能地少含方法和属性。每一个方法或属性的调用都需要大量处理。因此,一个编写的好的服务器端组件应该几乎不含明显的方法和属性。组件含有的那些方法和属性会带来更多的参数。具有很多参数的调用越少,性能就越好,尤其是你的网络应用程序需要支持许多用户时。这个技巧和许多开发人员的经验是相反的。尽量少的使用带有许多参数的调用也会带来另外一些问题,这使得编码和调试更加困难,但是速度上的改进是与付出的努力相当的。
服务器端组件必须实现恰当的线程模型。利用单线程组件可能导致服务器限制一个线程的会话,这将带来速度的明显下降。应该选择VB的房间模型线程选项并且努力避免单线程组件。但是,VB不能创建你可以在Visual C++里发现的具有线程选择范围的组件,。这一点也表明VB不是一种很合适这项工作的开发语言。
服务器端组件应该使用早期绑定。如果你的服务器应用程序要扩容,这显得特别重要。早期绑定的对象在编译时就拥有引用解析,可以节省不少执行时间。
服务器端组件不能使用在应用程序或会话作用域的声明中。请注意你的控件是如何被限定作用域的。作用域描述了如何创建一个组件的实例,这对你的服务端组件的成功起着关键作用。正如上月所讨论的那样,存在三种级别的作用域:页面级,会话级和应用程序级。页面级作用域对象可以用页面本身的HTML和ASP脚本代码来创建。页面级作用域组件的最佳性能可以通过使用房间线程来得到。而对应用程序级和会话级作用域组件来说,可以通过使用ATL组件的双线程模型来得到。同作用域结合的线程模型也影响服务器的安全性能。例如,一个利用应用程序级作用域的房间线程组件在系统安全环境里运行,但并不是当前用户的安全环境。这对那些具有安全意识的人来说可能是一个问题。
为了速度,服务器端组件应该是进程中组件;为了稳定,则应该是进程外组件。有两种方式去创建COM(OLE)服务器--进程中和进程外。在VB里,你用EXE或DLL扩展名去编译服务器。具有DLL扩展名的OLE服务器就被称为进程中服务器;而具有EXE扩展名的被叫做进程外服务器。进程外意味着组件作为一个独立的过程在运行,而且与调用它的应用程序不共享地址空间。运行进程外组件会导致性能的降低,因为Windows不得不在两个或多个应用程序之间来回移动数据。进程中意味着组件在调用它的应用程序的地址空间里运行。在过程之间交流无需中间物,这使性能显著提高。进程中组件的负面是如果组件失败,那调用它的应用程序也会失败。
服务器端组件使得创建一流的解决方案成为可能。利用IIS,可能还得用上MTS,你可以基于Windows NT的强有力的处理能力创建高性能的可升级的网络应用程序。
Hank Marquis是现代软件(Modern Software)的创始人,可以通过hankm@modernsoftware.com来联系他。本文首次发表于BackOffice CTO杂志。
我们微软公司希望这篇文章的信息对你有用。但是,使用这些信息是你自己愿意承担的风险。这里所有的信息都以"好像是"的方式提供,对信息的准确性、完整性、针对某种特定目的的适用性、无害性没有任何明显的或者暗示的担保,文章中提到的所有第三方产品或信息都不是被微软公司授权,推荐,支持和提供保证的。微软公司你使用这些信息而可能蒙受的无论是直接、间接、特殊的、偶然的或者有因果关系的损失不负任何责任,即使这种损失的可能性被仔细考虑过。文中提到的所有产品的价格都可以在不另做通知的情况下改变。