为了应用容错的概念,同时从物理和逻辑这两个层次理解Web服务的结构是很重要的。其理由是,系统错误可能由多方面的原因造成,例如:
?硬件故障
?程序错误
?软件错误
?安全漏洞
了解在Web服务系统里会发生什么类型的错误将有助于你在故障发生的时候检测到错误,并正确地处理它们。
硬件故障
除了要注意运行Web服务的物理计算机之外,你还应该关注网络硬件。事实上,在网络上,你(系统)的可恢复性也只是同整个链上最脆弱的一环一样(有限)。要记住,这个链会从你的Web服务应用程序一直到终端用户上――这其中有些东西是你不能控制的。常见的网络容错解决方案包括:带有多个网络适配器的多个应用程序服务器,运行在容错的以太网上,并具有到Internet的冗余连接。
程序错误
如何保护你的Web服务免于程序错误?一个关键的方面是保存(persistence),它用于数据和事务处理正在进行中的保存。换句话说,只要Web服务一接收到请求,请求信息就会被保存在Web服务以外的某个地方。有了这种方法,一旦Web服务在处理请求的时候崩溃,数据就能够从被保存的地方恢复和重新处理了。除了保存请求信息,你还可以保存请求的状态,这能够有助于你避免重复新增已经为处理请求而运行的进程。
此外,使用正确的工具也能够有助于防止程序错误。例如,有很多供C和C++程序员使用的工具,它们会帮助防止空指针和缓冲区溢出。Java程序员也不能完全避免发生同样的问题,但是他们可以通过充分利用Java相当优秀的错误处理机制来提高容错能力。
还有一些其他同程序相关的值得注意的错误。如果你的应用程序使用WSDL的描述,那么你WSDL里的错误可能会导致应用程序里的错误。建立一个动态地获取来自UDDI服务器的WSDL描述的系统,可以有助于将可能出错的描述用正确的描述来替换,而这只需要通过重新发布到UDDI服务器来实现。
软件错误
第三方软件所存在的问题是:它使你受到了软件提供商的束缚。软件提供商控制了源代码,并负责错误的修补。事实上,有些公司可能不愿意公布其软件里已知的风险,因为它害怕这样会影响到公司的市场价值。
一个好消息是,软件生产商常常有更多的资源,从而能够在生产(发行)软件之前花(足够的)时间进行测试并找出问题。因此,软件生产商一般都能够做出相当稳定的产品。由于你无法控制产品的源代码或者修复其错误(一般是这样的),因此你都处于软件生产商的束缚之下。很多用于第三方软件的容错方案都是根据检测到的错误,然后重新启动应用程序。这是建立在假设关闭应用程序,然后再次启动它就能够解决很多错误(例如内存外泄)的基础上的。
安全漏洞
创建没有安全漏洞的系统非常困难。这是因为大多数系统都受到保护,从而免受“已知”风险的影响。换句话说,由于你无法防止所有的东西,所以你只能尽力了解系统哪里有漏洞,然后填补上。不幸的是,很多安全漏洞会导致未知的风险。使用主动入侵检测系统和动态防火墙能够有助于识别未经授权的应用程序用户,并在他们做出破坏之前阻止他们。