Steve Vinoski序

如果从事软件开发工作的时间足够长,你肯定有过所谓的“忆往昔编程岁月稠”的经历。开发人员在社交场所聚集(如共进午餐)时,经常会发生这样的事情。一切都是在不经意间开始的,某位开发人员讲到他最近遇到的一个相当棘手的问题。另一位开发人员不甘人后,马上插话,一五一十地说道他是如何征服另一个更棘手的问题的。然后,每个故事都力图比前一个更精彩,最后只剩下老鸟们谈论最古老的计算机,这种计算机只有几字节内存,编程时使用的是打孔卡片或拨钮开关。我期待着有那么一天,有人在“忆往昔”时力图让我相信,他最初涉足编程时,只能使用0,而没有1。

开发人员之所以能够像上面描述的那样相互攀比,是因为编程天生就要求做大量取舍:应用程序之间必须共享计算资源;内存和磁盘空间都有限;CPU每秒能处理的指令数是固定的;磁盘和设备I/O可能需要相对较长的时间;建立数据库连接和网络连接可能需要很长时间,还可能占用大量资源。在电子计算的整个历史中,硬件、操作系统、中间件和应用程序都取得了巨大进步。遗憾的是,即便如此,在很大程度上来说,编程依然是一种做出正确取舍、让整个计算解决方案尽可能卓有成效的艺术。

所有应用程序都需要管理某种形式的资源,如内存、网络连接、数据库连接或线程,但是,有的应用程序在编写和调优后,能妥善管理资源,有的却不能够,二者之间有着显著差异。对只是偶尔短暂运行的简单应用程序(如基本命令行工具或配置GUI)来说,忽视资源管理不是什么问题。但如果开发的应用程序将长时间运行,且必须健壮、高性能、可扩展(如Web服务器、应用程序服务器和通知系统),那么不重视资源管理必将导致失败。

本书介绍资源管理模式。一般而言,资源需要获取、管理和释放,本书介绍了专门针对这3个方面的模式。这3个主要方面可能对运行的应用程序的整体性能、规模、可扩展性和使用寿命有深远影响。例如,很多应用程序都从堆中获取内存,对Web服务器或应用程序服务器等应用程序来说,在处理请求的代码中每次从堆中分配内存时,都将进一步降低服务器的性能和可扩展性,因为这需要调用堆管理器,还需获取和释放互斥锁以防堆被并行访问,而这些操作的开销不菲。在这样的应用程序中,可使用Partial Acquisition模式,在执行请求处理代码前提早获取尽可能多的资源。还可使用Caching或Pooling模式,将资源留下来供下次请求使用,而不是先将资源释放,以后再重新获取。通过正确地结合使用多个资源管理模式,可极大地改善应用程序的性能和可扩展性,其成效之显著,即便是经验丰富的开发人员也会感到惊讶。

本书承袭了POSA系列丛书的传统,强调实用性的解决方案。介绍每个模式时,都详细描述了实现问题,并详尽地列出了模式的已知应用,这是我特别喜欢的一点。另外,本书用两章的篇幅提供了详尽的案例研究,这些案例不仅演示了如何在实际应用程序中使用模式,还说明了这些模式之间的关系。归根结底,模式描述了在实际应用程序中行之有效的方法,且模式作者将模式与其来源和影响有效地紧密联系在了一起,从而确保它们始终与现实世界紧密相连。

一般而言,软件模式可帮助我们决定在架构和设计中做出哪些取舍以及在什么地方取舍。编程工作毕竟要靠人来做,而模式可提高抽象及沟通的程度,有助于团队实现架构和设计的社会化。在漫长的职业生涯中,我曾任中间件架构师、设计师和实现人员,曾不时地成功使用了本书介绍的各个模式。遗憾的是,在我这样做时,还没有人把这些方法总结成模式,这意味着我与同事需要设计我们自己的变种、实现它们、通过测量确定取舍、根据测量结果进行改进和调整,这花费了大量的时间。现在,Michael和Prashant以模式语言的方式清晰而全面地记录了这些方法,你可以更轻松地与同事进行探讨,进而明白它们有何优点、最适合用于什么样的情形,以及实现它们时需要考虑哪些作用力。

学习了这些资源管理模式的知识,掌握了优秀的性能测量工具,你就能快速而轻松地将性能和可扩展性平平的应用程序变成个中翘楚,连自己都大吃一惊。具备这些技能后,在下次“忆往昔”时,你的故事定将给老鸟们留下深刻印象。

——IONA科技公司产品创新部首席工程师Steve Vinoski

目录

  • 献词
  • Frank Buschmann序
  • Steve Vinoski序
  • 关于本书
  • 第1章 绪论
  • 第2章 资源获取
  • 第3章 资源生命周期
  • 第4章 资源释放
  • 第5章 资源管理模式应用指南
  • 第6章 案例研究:自组网
  • 第7章 案例研究:移动网络
  • 第8章 模式的过去、现在和将来
  • 第9章 结语
  • 引用的模式
  • 表示法
  • 参考文献
  • 模式索引
  • 索引