ACE(ADAPTIVE Communication Environment)是用于构建高性能网络化应用和下一代中间件的开放源码工具包,已在世界各地的许多软件项目中得到了广泛应用。本书是《C++网络编程》(卷1)的续篇,由ACE的创始人Douglas C. Schmidt及主要开发者之一Stephen D. Houston撰写而成,其内容涵盖了ACE中的各主要框架的基础概念、模式及使用规则。本书将向你描述这些框架的设计,以及它们可怎样帮助你克服较低级的本地操作系统API与较高级的分布式计算中间件的各种局限,高效地开发出高质量、可移植的C++网络化应用。本书是继受到了高度赞誉的POSA2(Pattern-OrientedSoftware Architecture: Patterns for Concurrent and Networked Objects)之后,Douglas C. Schmidt撰写的又一著作,通过学习本书,你将能更深入地了解和掌握适用于网络化应用开发的各种设计模式。
译序\r\n前言\r\n关于本书\r\n第1章 用于网络编程的面向对象框架\r\n 1.1 面向对象框架综述\r\n 1.2 比较各种软件开发和复用技术\r\n 1.3 将框架应用到网络编程\r\n 1.4 周游ACE框架\r\n 1.5 示例:网络化日志服务\r\n 1.6 总结\r\n第2章 服务和配置设计维度\r\n 2.1 服务和服务器设计维度\r\n 2.2 配置设计维度\r\n 2.3 总结\r\n第3章 ACE Reactor框架\r\n 3.1 综述\r\n 3.2 ACE_Time_Value类\r\n 3.3 ACE_Event_Handler类\r\n 3.4 ACE定时器队列类\r\n 3.5 ACE_Reactor类\r\n 3.6 总结\r\n第4章 ACE Reactor实现\r\n 4.1 综述\r\n 4.2 ACE_Select_Reactor类\r\n 4.3 ACE_TP_Reactor类\r\n 4.4 ACE_WFMO_Reactor类\r\n 4.5 总结\r\n第5章 ACE Service Configurator框架\r\n 5.1 综述\r\n 5.2 ACE_Service_Object类\r\n 5.3 ACE_Service_Repository类\r\n 5.4 ACE_Service_Config类\r\n 5.5 总结\r\n第6章 ACE Task框架\r\n 6.1 综述\r\n 6.2 ACE_Message_Queue类\r\n 6.3 ACE_Task类\r\n 6.4 总结\r\n第7章 ACE Acceptor-Connector框架\r\n 7.1 综述\r\n 7.2 ACE_Svc_Handler类\r\n 7.3 ACE_Acceptor类\r\n 7.4 ACE_Connector类\r\n 7.5 总结\r\n第8章 ACE Proactor框架\r\n 8.1 综述\r\n 8.2 异步I/O工厂类\r\n 8.3 ACE_Handler类\r\n 8.4 前摄式Acceptor-Connector类\r\n 8.5 ACE_Proactor类\r\n 8.6 总结\r\n第9章 ACE Streams框架\r\n 9.1 综述\r\n 9.2 ACE_Module类\r\n 9.3 ACE_Streams类\r\n 9.4 总结\r\n术语表\r\n参考文献\r\n索引
在网络化计算中间件领域中,ADAPTIVE Communication Environment(ACE,自适配通信环境)工具包已经取得了极大的成功。由于其所具有的灵活性、性能、平台覆盖率,以及其他一些关键属性,ACE得到了来自网络化应用软件社群的广泛接受——它在数千种应用、数十个国家和成打的领域中得到使用就是证明。因为ACE是“高质量、设计良好的面向模式软件架构(Pattern-oriented Software Architecture)”的开放源码典范,所以在中间件社群之外,它也受到了相当的关注。
但ACE何以会如此成功?恰当地回答这一问题需要一番思量。让我们以对《C++ Network Programming: Mastering Complexity with ACE and Patterns》(C++NPv1)序言的反思,以及重新“启动”我的同事Steve Vinoski在其中介绍的公共交通系统类似物来作为开始。Steve是对的,高质量的公共交通系统并不仅仅由飞机、机场、火车、火车站和铁轨组成,它还需要一些不那么明显的基础设施,比如调度、路线安排、售票、维护,以及监控。但即使是将所有的组成部分聚拢到一起,也仍然不足以发展出一套有效的公共交通系统;安排这些组成部分,使它们能够无缝地实现其首要目标,快速而可靠地运输旅客,也同样重要。售票点设在火车维修处或飞机机库,或是计划的与实际的调度及路线安排不为公众所知,你会使用这样的公共交通系统吗?我怀疑!
公共交通系统的成功不仅取决于对所提供的基础设施各部分的了解,它还取决于这些不同的部分怎样与它们的环境连接和集成在一起。有了这样的知识,公共交通系统的架构设计师才能够有效地将各个单独的部分集成进更高级的“积木”(Building Block)中,并将这些“积木”连接在一起。例如,售票处、问讯点、行包房和进站口被集成进位于缄市中心和主要城郊中心的火车站。同样,机场常常临近大城市,并通过频繁的特别快车相连接。
即使是公共交通中心自身也要进行安排,以使各种事务能够有效地完成。例如,当你通过主入口进入火车站或机场时,你会发现票务代理、信息中心和时间表。你还会发现可以满足你旅行需求的商店。当你进入主候车室或机场中央大厅时,你会发现其他的信息中心、最新的班次信息,以及火车月台入口和登机门。因此,公共交通中心不仅要提供出发和到达所必需的服务,它们还要有效地组织内部的“控制流”。虽然大多数火车站和机场的核心结构和控制流是类似的,但它们的具体实现却可能相去甚远。但我们仍能够马上识别出这些公共交通中心的模式,因为它们符合我们通过多年经验所学到的一些不变的关键特征。
那么,在成功的公共交通系统设计和ACE的成功之间的关联是什么?答案很简单:除了基本的网络计算组件(Doug和Steve在C++NPv1中介绍的各种wrapper facade(包装外观)),ACE还包括了一些有用的、在这些wrapper facade之上构建的面向对象框架(Object-Oriented Framework),并提供了一些有用的、更高级的通信服务, 比如事件多路分离和分派(Event Demultiplexing andDispatching)、连接管理(Connection Management)、服务配置(Service Configuration)、并发(Concurrency),以及分层的流处理(Stream-processing)。通过对你的应用结构和内部控制流进行有效的组织(借助于经由多年经验所掌握的关键模式),ACE框架服务能满足许多网络化软件的需求。
ACE框架能够带给你许多重要的好处:
● 你无需开发ACE已经提供的能力,这将节省相当可观的时间和精力。因此,你可以专注于你的关键责任:实现你的客户和最终用户所需的应用功能。
● ACE框架使得大量的网络编程专家经验得以具体化,这些经验是Doug、Steve,还有他们的同事在数十年中获得的。特别地,ACE框架高效地实现了网络化应用共有的各种具有典范意义的类、类关系和控制流。世界各地的数千用户经常地测试A,CE框架,从而产生了许多有益的修正和改进。作为一个ACE用户,你可以直接在你的应用中利用ACE框架的正确性、有效性和高效率。
● 如果一个框架不能适配(Adaptedto)特定的用户需求,它就不是一个框架。这意味着你可以在网络化应用的各种关键的变化点上让ACE框架进行适配。例如,你可以让ACE Reactor(反应器)框架进行适配,使用不同的事件多路分离器函数,比如WaitForMultipleObjects{》或select()。同样,可以通过不同的IPC机制来配置ACE Acceptor-Connector(接受器—连接器)框架。虽然这种可适配性自身就是有益的,ACE还向前走了一步:你可以通过各种可用的和可互换的实现,来为许多适配工作配置合乎需要的策略。例如,除了上面所提到的不同的Reactor实现,ACE还提供了各种IPC机制<比如Sockets、SSL、TLI,以及共享内存)的wrapper facade,从而帮助你为特定的平台和应用配置ACE Acceptor-Connector框架。
● 最后但并非最不重要的一点是,各种ACE框架并非是孤立存在的。因此,你可以以各种新颖的方式来组合它们,创建各种网络化应用和全新的中间件类型。例如,你可以将Reactor框架与Acceptor-Connector框架集成在一起,从而把事件驱动应用中的连接建立和服务处理功能分离开来。使用ACETask<任务)框架,你同样可以将各种形式的并发引入你的应用。
多年来,我指导和领导了许多软件项目,结果发现ACE能极大地简化这样的任务:采用易于定制的可复用中间件来满足网络化应用的需求。不是所有的网络化应用都需要像应用服务器、Web服务,以及复杂的组件模型这样的重量级中间件。而大多数网络化应用都可以从像ACE这样的可移植和高效的主机基础设施中间件(Host lnfrastructure Middleware)中获益。这样的灵活性是ACE成功的关键,因为如果你不使用其全部功能的话,你无需采用整套的中间件。相反,你可以只组合你所需的最基本的ACE中间件类,创建小型的、却又足够强大的应用。因为这一原因,我预计,在今天的重量级中间件的影响衰退之后,ACE仍将长久地为我们使用下去。
ACE的巨大灵活性并不会让我们陷入大量不兼容的中间件实现之中。例如,如果你要构建一个嵌入式系统,它通过CORBA Internet inter-ORB Protocol(IIOP)与外部世界进行“交谈”,你可以使用The ACE ORB(TAO)——这是一个使用ACE wrapper facade和框架构建的对象请求代理(ORB),它是遵循CORBA、开放源码和实时的ORB。但是,如果CORBA对于你的应用需求来说太过度了,你可以使用适当的ACE类来构建定制的、且仍是可互操作的中间件。两种解决方案可以基于同样的核心结构和协议,比如ACE Common Data Representation(CDR,通用数据表示)类和TCP/IP Socket wrapper facade。这样它们可以无缝地互相通信,就像你乘坐从巴黎到伊斯坦布尔的列车——著名的“东方快车”——穿越许多欧洲国家,不必因为不兼容的铁路网络而更换列车。
如Steve Vinoski和我所指出的,在高质量的公共交通系统和高质量的网络中间件之间有许多相似之处。对于我和世界各地的其他C++开发者来说,ACE就是用于构建高质量的网络中间件的工具包!不过,在说了如此之多的关于ACE的好话之后,让我们再回到这篇前言的主要意图上宋:介绍《C++网络编程》系列的第2卷(C++NPv2)。如同所有的软件技术和中间件的使用一样,你对你的工具了解越多,你就越能够更好地应用它们。而在你的应用中使用ACE只是改善你的网络化软件的一个方面。因此,要想显著地从ACE的许多优点中获益,你还需要彻底地理解在其强大的框架之下的核心概念、模式和使用规则。
许多年来,我们常常通过学习ACE的代码、注释,以及示例应用来学习ACE。显然,这一过程既耗费时间,又容易出错。而且,即使你设法阅读了ACE中的数十万行代码,也很容易“只见树木,不见森林”。如两千年之前的希腊哲学家Thucydides所写下的:“一个人拥有知识,但却没有能力清晰地表达他自己,这简直就和他从来没有过任何思想一样。”
我们因而是幸运的:Doug和Steve从他们繁忙的工作安排中挤出时间,撰写了这样一本高质量的关于ACE框架的书。使用流行的、来自POSAIPOSAl,POSA2]和“Gang。fFour”[GoF)模式丛书的并发和网络模式,C++NPv2以一种易于理解的形式解释了在ACE框架之下的思想和概念。这些模式又使得许多常见网络问题中有思想性的、经过了时间证明的解决方案得以具体化。例如,它们告诉你问题是什么、这些问题为何很困难、这些问题的解决方案是什么,以及这些应用于ACE的解决方案为何是高质量的。ACE正在造就下一代的网络化应用软件,如果你想要全面了解ACE中的模式和框架,那就阅读本书吧。我已从中学到了许多东西,我确信你也将是如此。