2.7.5 缺乏防御机制

这里介绍的许多导致运行中破坏性后果的问题,都来源于对系统间交互的误解。因为开发人员无法了解与其组件相互作用的不同语言和技术之间的所有细微差别,所以他们就需要设计健壮的防御措施。应用程序质量意味着,在设计一层或其组件时,开发人员就应该明白其他层可能出故障,可能会以无法预期的方式响应,可用资源或连接可能会过载,其行为可能会失常。假如开发人员实现某层时不能事先估计到每种情况,那么他们必须实现防御式代码,从而能支持应用程序面对影响到其他层的压力或失败的性能。缺乏这种防御式结构的层是脆弱的,因为它们在和其他层交互时无法保护自己。

例如,应用程序在线程被阻塞且无法终止时会挂起。防火墙可能终止一个它认为非活动的连接,而且不会向相关应用程序各层的连接点发送终止通知。因为TCP没有提供超时机制,所以这些应用程序的层还认为它们仍然处于连接状态,并继续等待永远不会到来的响应。类似地,当多个线程需要对遍布应用程序的多个资源进行同步时,如果不同的线程锁住了其他线程需要的资源,从而所有的线程都无法获得完成其处理所需的全部资源,那么这些线程可能会死锁。

解决这些问题需要引入防御式代码,如在请求层实现超时机制或断路器,从而能终止请求并释放阻塞状态的线程。然而,这种防御机制的缺乏在功能测试中经常不会检查,并且也不会出现,除非负载测试把某层压到来自其他层线程的阻塞请求。这些问题可以通过模拟合适的压力条件来动态检查,或者静态地查找那些处理层的设计中可能遇到的压力的合适的防御式代码。

这些应用程序结构质量问题中的每一个都会导致不可预测的应用程序性能、业务中断及数据错误,并使改动应用程序以应对紧迫的业务需要变得困难。可靠地检测这些问题需要在整个应用程序的上下文中分析每个应用程序组件并评估各个组件的结构质量。