Domino与浏览器
米国的《独立宣言》告诉我们:人生来是平等的。站在人权的层面,这或许是正确的。
但事实告诉我们,站在能力与天赋的层面,人生来是不平等的。有些人天生会唱歌,有些人天生会跳舞,有的人天生语言能力强,有的人天生对数字敏感。
“Born to be or not to be”,天生适合什么不适合什么?这是摆在每个人面前的选择。但可惜我们大都没有行使这个选择的权力,在很多因素的影响(家庭,教育等)下,人们只能随着惯性,顺着大流去从事一些自己不那么喜欢或者不那么擅长的事情。
但比天赋更重要的是:只要够勤奋,肯努力,我们一样可以把这些事情做得很好。
人尤如此,软件亦然。对软件而言,同样有天生适合与不适合的分别。在某种特定背景下诞生的软件,自然而然具有某种特定的架构,适合于特定的用途。如果让某个方面已经较为成熟的一个软件,忽然面临一个崭新的需求,那么它也同样会有一个适应和转变的过程。
对R 4.5时的Notes就是如此。IT界继PC之后最猛的一股浪潮席卷而来,给Notes带来的与其说是新需求,不如说是新压力。
这股浪潮就是互联网技术,给Notes带来的压力就是对Web的支持。
事实上,对互联网的影响力,Notes体现出了足够的技术敏感。虽然Notes在R 4.5才正式成为交互式的Web服务器,但对Web的支持早在两年前R 4.0的时候就已经提供。在R 4.0时用户已经可以将Notes转换成HTML页面,然后显示在web上。虽然只是一个静态的格式,但毕竟是一个开始。
而互联网的飞速发展很快让Notes意识到,对Web的支持只做到这个程度是远远不够的,因为来自竞争对手的压力越来越大。所以1996年12月,IBM(95年完成收购) 推出Notes R 4.5,这种新服务器把互联网标准和协议的开放联网环境和 Notes 强大的应用程序开发设施结合起来,使企业和组织能够开发出业务的Web解决方案。也许是为了让这次变化更加有纪念意义,IBM为服务器取了一个全新的名字:
Domino。
可以说,Domino这个名字为了Web而生的,而此后的每一代Domino设计时,也都把对Web的支持改进作为非常重要的一个课题。
1996年,Domino R4.5支持将Notes的内容动态发布到网页上,开创了OA系统的Web新时代。
1999年,Domino R5问世,宣传口号是“生来与Web集成”。
2002年,Domino ND 6诞生,这次它的身份是三元归一的服务器(以Domino+Notes为代表的客户/服务器体系结构(“C/S”);以浏览器+Web服务器为基础的瘦客户机模式(“B/S”);以关系数据库内容管理为主的体系结构(“RDBMS”)),将Domino的B/S功能提到了与C/S功能等同的高度.
......
可以这样说:从诞生到现在,围绕着Domino服务器的Web功能的改进就没有停止过.这些改进决不仅限于一些Bug的修正,其中也包括很多模式上的修改。尤其是R5到ND 6,诸如活动线程处理模型这样的核心模块也做出了相应的调整,许多API或者函数也发生了变化(这也是为什么从R5到ND 6的B/S应用升级相对于C/S应用而言要复杂的原因),凡此种种,其目的只有一个,提高HTTP进程整体处理性能,降低对资源的占用。从实际使用来看,Domino的HTTP性能与功能确实是在不断的提高,而且每一个版本的改进相当显著。
然而从诞生到现在,围绕着Domino服务器的Web功能的争议也从来没有停止过。
对Domino服务器HTTP功能的置疑包括:
HTTP容易挂起或宕机、访问速度慢、Web服务器功能相对简单......
一句话,Domino不适合开发Web应用,因为它天生是做C/S应用的软件。
后半句我绝对同意,Notes从诞生之初就是用作C/S应用。从上一节Notes的架构介绍中我们也能感受到这一点,Notes客户端既可以远程访问服务器上的nsf库,也可以不经过服务器直接本地操作nsf库,本地库通过复制技术与服务器进行同步。毫无疑问,这是一个非常漂亮的C/S(客户端/服务器)架构——更确切一点——胖客户端架构(可惜这个年头,连客户端都流行减肥)。
回到本节的开始,“Born to be or not to be”,天生是什么不是什么?虽然R5时,Domino宣称过“生来与Web集成”(注意这个提法“集成”),但从根本上来说,Notes或Domino生来就是一种客户端/服务器应用,NOTES BORN TO BE A C/S APPLICATION! 这根本不用否认也无需否认,因为C/S绝不意味着落后与过时!(关于C/S与B/S的比较,在Domino的未来发展中我们还会提及,这里就不再赘述了。)
没错,Notes天生是C/S架构,更适合开发C/S的应用。无论是在客户端开发中更多的设计元素,还是客户端使用中更多的界面功能,都表明了Lotus对Notes客户端的器重,但是,这不能作为Domino不适合开发Web B/S应用的理由。
那么其他理由呢?
HTTP容易挂起与宕机?
——在我的印象中,所有Domino任务里面,HTTP的确是比较容易宕机或者挂起的一个,尤其是挂起。HTTP挂起往往带来比较恶劣的影响,因为用户会在第一时间发现服务请求得不到响应,管理员的电话瞬间就会被各式各样的投诉占满。HTTP挂起往往是所有Domino故障中最让人痛苦的一个,因为可能造成HTTP挂起的原因非常多,要准确定位HTTP挂起的原因一般需要打开服务器的debug参数,获取故障时所有HTTP线程的httpr记录。。。一句话,管理员们都不喜欢看到HTTP挂起,但很多情况下却不得不面对。
我曾经在很多Notes开发论坛上看到请教解决挂起问题的帖子,也有很多人分享自己的一些经验,不过很多时候,这类帖子往往以这样一句话收尾:“Domino的HTTP进程就是容易挂起,升级一个新版本吧。”
升级的确是一种解决问题的好办法,但是对挂起并不总是有效——或者应该说,很少有效。这是因为,从IBM 800以及IBM 服务人员解决挂起问题的经验来看,绝大多数的HTTP挂起的原因都不是Domino自身的bug,而是应用开发。
举一个例子,比如在应用开发中,如果用到了java代理或者servlet,申请了Notes object之后,有没有释放?有释放的话,释放语句写在什么位置?是try模块里还是finally模块里?这看似一个很初级的问题,但是在很多情况下就是这种编程风格的巨大漏洞会造成java的内存无法回收,从而引起挂起。——补充一点,我个人认为,JAVA的GC(垃圾回收)机制是一个非常可怕的东西,不是说这个思路不好,而是说很多开发者错误的认为有了GC机制就不用在编程中考虑Java的内存回收,这是非常致命的编程隐患,对J2EE和Domino应用都是如此。
其他可能的问题还有,对一些共享资源没有添加锁机制,导致http线程间出现死锁。初步确定这种问题的方法也很简单(注意,是确定而不是解决),把server文档中同时运行web代理的选项选成否之后问题往往会消失,但性能也会大幅下降(所以只能用来确认问题而不是解决问题)。这种情况下需要仔细排查代码,找到问题的所在。所用的工具嘛。。。sigh,还是那个残忍的nsd。。。建议最好还是交给专业人士去分析吧。
还有用户或者开发商希望在Domino HTTP挂起之后,可以通过调整参数解决问题。例如增加活动线程数,取消持久连接,增加最大连接数等等,某些情况下,这种做法可以降低挂起几率,但正如上面提到的,绝大多数的HTTP挂起的原因还是在应用开发上。如果代码中的问题不彻底找到,那么负载一旦加大,挂起依旧会出现。
另一方面,Domino HTTP自身有没有bug或者漏洞?当然有,也不少(只要是软件就一定有bug),但是远远没有多到可以把所有的HTTP问题都推给升级或打补丁来解决的地步。即使在R5甚至更早的版本上,Domino都不乏大量B/S成功案例,而在今天国内许多开发商也都是基于Domino的Web功能在开发应用。在开发调试或者运行过程中,谁没有碰到过挂起?恐怕很少。但好的开发商会按照相应的步骤去调试,在厂商的帮助下定位挂起的真正原因,而不是一遇到挂起就去归咎于产品本身。类似于Java内存回收漏洞这样的错误,无论是放在Domino的什么最新版本上,或者放在WebSphere,WebLogic的什么最新版本上,都注定会引起系统的崩溃。
总而言之:
一,Domino的HTTP本身并不会那么频繁地挂起,但某些不好的开发习惯会引发这一点;
二,升级或者打补丁可以防止一些问题,但永远不是解决问题的最好手段,除非厂商在分析原因之后建议你这么做。
至于Domino HTTP访问慢,我想这个问题较之挂起更加难于解释(或者说易于解释)。因为性能调优绝对不是某一个功能的责任,而实在是一个难以一言蔽之的东西。
首先,没有任何测试结果表明Domino在动态页面这个领域的表现上弱于JSP,ASP或者PHP(著名的3P)——而有很多数据表明JSP的性能的确是优于ASP和PHP的——如果考虑到Domino支持servlet,而servlet与JSP实际上就是一种技术的两个层面这个事实的话,那么完全可以说,Domino的动态页面能力是相~~当不错的。
更重要的是,HTTP的访问速度取决于很多东西,HTTP服务器的处理能力只是其中一环,且并不是决定性的一环,相比之下,页面的复杂程度,架构模式以及服务器的硬件调优是更加影响用户响应时间的因素。很多情况下,用户只是看到了最终结果——用浏览器访问Domino速度慢,便得出了Domino HTTP访问慢的结论,而没有看到这个慢的原因可能是慢在Domino与外界关系型数据库的连接上,可能是慢在服务器的IO上,可能是慢在那一时刻的代理大量运行上,可能是慢在网络传输上。。。在很多情况下,用户看不到也不需要看到这一切,他们只需要得出结论:HTTP 访问慢!
作为用户,做出这样的判断无可厚非,因为他们只需要也只应该面对浏览器去使用Domino系统。但是作为管理员或者开发商,要做的事情绝不只是简单地附和,然后把问题再次甩给Domino平台的升级,而应该耐心地定位具体造成HTTP访问缓慢的原因,并制定相应的对策。调优是一件很复杂的工程,Domino虽然封装性很强,能够帮程序员自动实现大量底层代码,但这并不意味着开发好NSF之后就大功告成。对一个健壮的系统而言,开发完成仅仅只是一个开始。
关于HTTP性能调优,有一篇Notes的官方文章“Improve Web Site Performance”,堪称这方面的bible。开篇第一句话就是:
Improving the performance of your Domino servers is an art. There are no hard and fast rules。
因为本为艺术,所以法无常法。
再来说说Domino HTTP功能简单的问题。说Domino HTTP功能简单,恐怕是相对于Apache,或者IHS(IBM HTTP Server)来说的。对此,我想说的是:Domino的HTTP本来就不应该单纯和Apache或者IHS进行比较。因为后者只是单纯的完成HTTP服务器的功能,而Domino的HTTP功能主要目的是将内容转换成动态网页。有人会将WebSphere内嵌的HTTP服务器与IHS做比较吗?不会,因为单纯做这样的比较没有任何意义。
之所以会有Domino HTTP与Apache等HTTP服务器的比较,我想主要还是源于Domino自身四合一服务器的特性(Web服务器,邮件服务器,应用服务器,目录服务器四合一),导致了IBM自己或者第三方评论机构将Domino与Apahce,WebSphere, IIS, Exchange, Sun one LDAP, IDS等等各式各样的产品进行比较——有时真不知道这是荣幸还是不幸。
从具体使用来看,应该说,Domino HTTP功能(单纯的HTTP功能)是相当不错的,微软早些时候在评价业界HTTP服务器时,也将Domino作为一款优秀的HTTP服务器加以罗列。但请不要因此就用Domino去替代Apache或者IHS,相反,如果在构建大型HTTP应用的时候,还可以考虑将IHS等Web服务器与Domino相结合。利用IHS对HTTP访问的良好管理和控制(例如静态缓存技术),增强整个Domino系统的性能。这是一个很好的架构,虽然在国内这样部署的不多。
所以在我看来,以上这种种对其HTTP的性能与功能的置疑并不能成为否定Domino/Notes的理由,还是那句话,Notes/Domino天生是C/S架构,更适合开发部署C/S应用,但这并不妨碍它成为业界认可的一款B/S服务器。为了获得这种认可,IBM在产品方面也确实做出了很大的改进,HTTP服务器的架构以及API方面的改动直到6版本之后才算基本定型,Domino大部分功能尽量做到在C/S和B/S上都能正常使用。
值得吗?当然值得。
还是R 4.5时,Notes就已经猜想到互联网引发的这股浏览器风潮迟早会刮进协作领域,逐步改变用户访问习惯。但Notes能猜到开头,却未必料想到有朝一日B/S应用会真的开始取代C/S应用成为主流。90年代初Sun曾经高喊过“网络就是计算机”,喊的时候为时尚早,但现在再看却已经不只是一句豪言壮语。且不说公网,目前在企业内网中基于Web的应用都越来越多。不只是邮件和公文,还包括许许多多其他业务系统:报销,CRM,ERP。。。甚至连字处理(Word),表格处理(Excel)这样的C/S传统优势项目,也开始受到像Writely这样在线字处理工具的冲击。
而这一切,仅仅还是Web 2.0概念尚未完全铺开时的局面。
一句话,B/S是一种趋势,虽然未必不可逆转,但是现在只有适应它才能生存下去。
生存!生存!生存!只有在生存之后,Notes/Domino才可以考虑接下来的发展。。。或者它会在B/S应用方面,继续增强对J2EE的兼容,在Servlet的基础上进一步的支持类似于EJB container这样的架构?(关于EJB container的增加,没有任何的官方说法,但“空穴来风,未必无因。”)
又或者,Notes/Domino会在C/S应用方面,继续做出孜孜不倦的探索,找出一种新型的客户端,谋求突破......