中间件是一系列服务、协议及支持软件工具的集合,它提供了实现现代分布式系统以及应用程序的“管道”,构成了Web服务、分布式对象、协同应用程序、电子商务系统以及其他重要平台的基础。以前,术语“中间件”很少耳闻,而中间件开发人员更是少之又少。但是在过去的十年里,其术语、研究和实践以及其影响已经变得十分普遍。到目前为止,还没有一本书描述如何构建面向对象(OO)的联网与并发中间件,所以中间件的设计在某种程度上仍然神秘莫测。本书揭开了构建中间件的神秘面纱,逻辑严密,以经验为导向,就像有一位专家循循善诱,仔细为你讲解常见的设计问题、驱动因素、成功的解决方案以及使用效果。

同大多数概念类似,很难明确中间件的边界。按照惯例,中间件包括构建系统和应用程序所必需的、除操作系统内核自身组成部分之外的所有软件。但是要想一眼就发现中间件在哪儿几乎是不可能的:中间件可以出现在库与框架中、操作系统及其附加软件中、Java虚拟机以及其他运行时系统中、粗粒度的软件组件中,以及Web服务等最终产品的组成部分中。

本书不是一部教科书,不会试图全面讲解中间件或者使用中间件来设计各种应用程序以及分布式系统架构。相反,它介绍了一种模式语言,涵盖了构建OO通信系统的设计步骤,而OO通信系统在大多数中间件中均有涉及。本书介绍的很多模式在上层和底层系统与应用程序中均有应用,这些系统与应用程序并不一定直接基于中间件构建。

本书在理论形式之上更加注重实际的解决方案。对于经验丰富的系统开发人员来说,本书所讲的很多模式背后的基本思想是众所周知的,例如分派、分离、回调以及配置。这些基本思想在某些情况下是更为通用的OO模式的变种,例如代理、适配器以及门面。本书的主要贡献集中于建立在上述思想基础上更为深入的工程解决方案。中间件的开发人员必须解决各种不同的驱动因素,包括处理能力、响应性、可靠性、互操作性、可移植性、可扩展性以及对旧软件的兼容性。与在小型OO应用程序和并发编程中看到的截然不同,上述驱动因素的多样性和严重性造就了中间件模式的复杂性。

如此大量的驱动因素,再加上多年的工程经验,通常会导致设计考量与工程折中千头万绪,促使人们将基本思想从它在中间件框架里的描述中提炼出来。通过将解决方案描述为一系列具体的设计步骤,本书使用的模式描述格式有助于简化该提炼过程。很多上述这些步骤反过来会调用其他模式。这些模式组合在一起就形成了模式语言,使开发人员能够在设计服务与应用程序的同时遍历一个又一个模式。

作者提到,本书所探讨的一些想法与技巧是对网络编程相关书籍内容的补充,比如W. Richard Stevens的诸多开山之作(例如介绍网络编程的[Ste98])。本书的主要出发点是对更高层面设计问题持续关注,例如,本书并不讨论UNIX select()调用的细节,而是阐释如何基于select()和其他操作系统调用构建一个组合式的灵活框架——Reactor。

现代平台提供了I/O、线程、同步以及事件分离等方方面面的功能,如何应用这些功能作为构建更高层次框架和组件的基础,也是本书隐含的主题之一。本书重点关注UNIX与微软操作系统中的C/C++并没有偏离上述主题。例如,Java编程人员将会发现在某些情况下会有一些微小的不相关,这些情况包括:Java已经直接实现了本书讨论的一些模式,比如Scoped Locking;Java提供了按照模式的特定实现组织的框架,比如JavaBeans框架对可配置组件的支持;Java无法访问底层系统机制,比如同步事件分离。

然而,如果你非常熟悉Java、Smalltalk以及其他OO编程语言,那么仍可以从模式表达的核心思想中获益,而且可以更好地领会一些模式为什么在语言特性和库中是直接受支持的以及如何实现这些支持,还将能够基于其他模式构建出有用的组件。我们来看一个示例,直到java.nio出现,Java才为异步I/O提供了访问系统组件的方法,但是在参考了本书所讲的Proactor模式后,我曾经完成了一个Java程序,通过一个简单的自循环(spin-loop)线程检测多通道上的I/O可用性,从而模拟了这种分离。上述实现效率虽然不高,但在它的目标使用环境中已经绰绰有余。

经过多年发展,本书所讲的一些模式,比如Reactor,已经从对设计发明(design invention)的描述成长为设计模式。对于有构建可移植OO中间件经验的开发人员而言,每个人肯定都写过或使用过至少一个Wrapper Facade。但是本书包含了其他一些早期出现的模式,并探讨了其设计方面新的贡献。模式必须是经得起时间检验、可以独立(重新)发现的解决方案,虽然起初对于这样的描述能否成为模式还有点不太确定,但是经历了时间的检验,本书所讲的模式确实抓住了关键驱动因素和设计问题的实质,作者和OO中间件社区对于这一点越来越有把握,他们还见证了本书介绍的解决方案在各种各样的环境中反复应用。

在这个大背景下,我邀请你来分享本书。通过阅读尤其是使用本书中的材料,读者将会发现在OO中间件开发人员的圈子里,Reactor和Proactor等模式名称已经人尽皆知,就如同OO GUI开发人员圈子里的Decorator及Observer一样。

Doug Lea

于纽约州立大学奥斯威戈分校

目录

  • 关于本书
  • 阅读指南
  • 第1章 并发与联网对象
  • 第2章 服务访问和配置模式
  • 第3章 事件处理模式
  • 第4章 同步模式
  • 第5章 并发模式
  • 第6章 模式的综合运用
  • 第7章 模式的过去、现在及未来
  • 第8章 结束语
  • 参考文献
  • 索引